實驗一 ?線性表的應用實驗目的和要求:通過實驗進一步理解線性表的邏輯結構和存儲結構,提高使用理論知識指導解決實際問題的能力,熟練掌握鏈表的實際應用。主要內容:題目1?:問題描述:編號為1,2,…,n的n個人按順時針方向圍坐一圈,任選一個正整數作為報數上限值m,任選一個人(編號為k)開始按順時針方向自1開始順序報數,報到m時停止報數,報m的人出列,從他在順時針方向上的下一個人開始重新從1報數,報到m時停止報數,報m的人出列,如此下去,直到所有人全部出列為止。試設計一個程序求出出列順序?;疽螅豪脝蜗蜓h鏈表存儲結構模擬此過程,按照出列的順序印出各人的編號。?
2 回答
已采納
Yexiaomo
TA貢獻152條經驗 獲得超157個贊
說一下思路,? 創建,?遍歷,?求長度...?略 主要是?viewList()?函數中的?那個?while()?循環有點繞,?本來想的是?,?當?計數?達到上限時,?就把這個值?輸出,?然后?將這個結點從鏈表中刪除 當寫寫發現,?每個好的標志,?早知道就在結構體中?多加一個?指示變量了,?(輸出過就?跳過,?沒有輸出過,?計數器?就加?1?) 這個還是有點麻煩的.?加了一個指針?永遠指向?所?刪除結點的?前面的那個結點,? 這樣寫,?還是有點不好的....
這是測試后代碼:
#include?<stdio.h>
#include?<stdlib.h>
#include?<malloc.h>
typedef?struct?Node{
int?data;
struct?Node?*pNext;
}?LNode,?*LIST;
/*函數聲明*/
LIST?createList();
void?traverseList(LIST?pHead);
int??ListLength(LIST?pHead);
void?viewList(LIST?pHead);
int?main(){
LIST?List?=?createList();??//?創建?
traverseList(?List?);????//?遍歷第一次?
viewList(List);??????????????//?輸出?
return?0;????????
}
/*?單循環鏈表的創建不用注釋了吧?*/?
LIST?createList()?{
int?n,?i;
LIST?pNew,?pHead,?pTail;?//定義頭結點,?尾結點?
pHead?=?(LIST)malloc(sizeof(LNode));
if(pHead?==?NULL){
exit(-1);
}
pTail?=?pHead;
printf("輸入人數:?");
scanf("%d",?&n);
for(i?=?0;?i?<?n;?++i){
pNew?=?(LIST)malloc(sizeof(LNode));
if(pHead?==?NULL){
exit(-1);
}
pNew->data?=?i+1;
pTail->pNext?=?pNew;
pTail?=?pNew;//始終將新產生的結點作為尾結點?
}
pTail->pNext?=?pHead;
return?pHead;
}
/*?遍歷?*/?
void?traverseList(LIST?pHead){
LIST?p?=?pHead->pNext;
while(p?!=?pHead){
printf("%d?",?p->data);
p?=?p->pNext;?
}
printf("\n");
return?;
}
/*?求長度,??和遍歷差不多?*/?
int??ListLength(LIST?pHead){
int?len?=?0;
LIST?p?=?pHead->pNext;
while(p?!=?pHead){
++len;
p?=?p->pNext;?
}
return?len;
}?
/*?這個是主要的?*/?
void?viewList(LIST?pHead){
int?i?=?1;
int?j?=?0;
int?cnt?=?1;?//作為計數
int?max;//最大上限
//首先鏈表不能為空
if(?pHead->pNext?==?pHead){
return?;?
}?
//最大上限不能為小于?0?的數?
printf("輸入報數最大上限為:?");
scanf("%d",?&max);
if(max?<=?0){
printf("輸入報數最大上限值有誤,程序終止!!!\n?");
exit(-1);
}
printf("\n");
//人員編號不能超過實有人數?&&?不能為負?
printf("輸入第一個報數的人員的編號:?");
scanf("%d",?&j);
if(j?<?1?||?j?>?ListLength(pHead)){
printf("輸入第一個報數的人員的編號?有誤!!!\n?程序退出!");
exit(-1)?;?
}?
//?將?p?指向第一個報數的員工?
LIST?p?=?pHead->pNext;
LIST?pp?=?pHead;//pp?永遠指向?p?指向的前面的那個結點?
LIST?q;?//作為臨時存儲?需刪除的結點?
while(p?!=?pHead){
if(i?==?j)
break;
p?=?p->pNext;
pp?=?pp->pNext;
? ++i;
}?
/*??這個循環是重點?*/?
while(?ListLength(pHead)?!=?0){
if(?cnt?!=?max?)?{
p?=?p->pNext;
pp?=?pp->pNext?;
if(p?!=?pHead)
++cnt;
}?else?{
printf("%d?",?p->data);
q?=?p;
p?=?p->pNext;
pp->pNext?=?p;
free(q);
cnt?=?1;
}
} ?
}這是所有代碼, 包括垃圾代碼, 各種思路, 雖然不是很重要, 但我覺得還是有必要
#include?<stdio.h>
#include?<stdlib.h>
#include?<malloc.h>
#define?OK?1
#define?ERROR?0
typedef?struct?Node{
int?data;
struct?Node?*pNext;
}?LNode,?*LIST;
LIST?createList();
void?traverseList(LIST?pHead);
int??ListLength(LIST?pHead);
void?viewList(LIST?pHead);
void?deleteList(LIST?pHead,?int?pos);
int?main(){
int?i;
LIST?List?=?createList();
traverseList(?List?);
// for(i?=?1;??i?<=?11;?++i){
// deleteList(List,?1);
// traverseList(?List?);
// }
viewList(List);
return?0;
}
LIST?createList()?{
int?n,?i;
LIST?pNew,?pHead,?pTail;?//定義頭結點,?尾結點?
pHead?=?(LIST)malloc(sizeof(LNode));
if(pHead?==?NULL){
exit(-1);
}
pTail?=?pHead;
printf("輸入人數:?");
scanf("%d",?&n);
for(i?=?0;?i?<?n;?++i){
pNew?=?(LIST)malloc(sizeof(LNode));
if(pHead?==?NULL){
exit(-1);
}
pNew->data?=?i+1;
pTail->pNext?=?pNew;
pTail?=?pNew;//始終將新產生的結點作為尾結點?
}
pTail->pNext?=?pHead;
return?pHead;
}
void?traverseList(LIST?pHead){
LIST?p?=?pHead->pNext;
while(p?!=?pHead){
printf("%d?",?p->data);
p?=?p->pNext;?
}
printf("\n");
return?;
}
int??ListLength(LIST?pHead){
int?len?=?0;
LIST?p?=?pHead->pNext;
while(p?!=?pHead){
++len;
p?=?p->pNext;?
}
return?len;
}?
void?viewList(LIST?pHead){
int?i?=?1;
int?j?=?0;
int?cnt?=?1;?//作為計數
int?max;//最大上限
//首先鏈表不能為空
if(?pHead->pNext?==?pHead){
return?;?
}?
//最大上限不能為小于?0?的數?
printf("輸入報數最大上限為:?");
scanf("%d",?&max);
if(max?<=?0){
printf("輸入報數最大上限值有誤,程序終止!!!\n?");
exit(-1);
}
printf("\n");
//人員編號不能超過實有人數?&&?不能為負?
printf("輸入第一個報數的人員的編號:?");
scanf("%d",?&j);
if(j?<?1?||?j?>?ListLength(pHead)){
printf("輸入第一個報數的人員的編號?有誤!!!\n?程序退出!");
exit(-1)?;?
}?
//?將?p?指向第一個報數的員工?
LIST?p?=?pHead->pNext;
LIST?pp?=?pHead;//pp?永遠指向?p?指向的前面的那個結點?
LIST?q;?//作為臨時存儲?需刪除的結點?
while(p?!=?pHead){
if(i?==?j)
break;
p?=?p->pNext;
pp?=?pp->pNext;
? ++i;
}?
while(?ListLength(pHead)?!=?0){
if(?cnt?!=?max?)?{
p?=?p->pNext;
pp?=?pp->pNext?;
if(p?!=?pHead)
++cnt;
}?else?{
printf("%d?",?p->data);
q?=?p;
p?=?p->pNext;
pp->pNext?=?p;
free(q);
cnt?=?1;
}
} ?
}
//void?deleteList(LIST?pHead,int?i)?/*?改變pHead?*/
//{?/*?刪除pHead的第i個元素?*/
//??LIST?p=pHead->pNext,q;?/*?p指向頭結點?*/
//??int?j=0;
//??if(?i?<=?0?||?i?>?ListLength(pHead)?)?/*?第i個元素不存在?*/
//????return?;
//??while(?j?<?i-1)?/*?尋找第i-1個結點?*/
//??{
//????p?=?p->pNext;
//????j++;
//??}
//??q=p->pNext;?/*?q指向待刪除結點?*/
//??p->pNext=q->pNext;
//
//??if(pHead==q)?/*?刪除的是表尾元素?*/
//????pHead=p;
//??free(q);?/*?釋放待刪除結點?*/
//??return?;
//}
//void?deleteList(LIST?pHead,?int?pos){
//????int?i?=?0;
//????LIST?p,?q;
//????p?=?pHead;
//????if(?i?>?pos-1?&&?i?>?ListLength(pHead))
//????????return;
//????while(?p->pNext?!=?pHead?&&?i?<?pos-1?)?{
//????????p?=?p->pNext;
//????????++i;
//????}
//????
//????q?=?p->pNext;
//????p->pNext?=?q->pNext;
//????
//????if(pHead->pNext==q)?/*?刪除的是表尾元素?*/
//???? pHead=p;
//?? free(q);?/*?釋放待刪除結點?*/
//????
//????return;?
//}點擊展開后面3條
- 2 回答
- 0 關注
- 1602 瀏覽
添加回答
舉報
0/150
提交
取消
