資料結構(C語言):連結串列,約瑟夫問題
阿新 • • 發佈:2019-02-14
開始學習資料結構,把寫過的程式碼發上來,希望可以給有需要的人一個參考。
//本程式碼由 大漠孤煙 整理編寫,並驗證通過 //求解約瑟夫問題,涉及到連結串列節點的生成,節點的插入和刪除,對理解連結串列非常有好處 //N個節點圍城一圈,從第一個節點開始計數(1),每數到第M的數刪除,看最後留下那個數 #include<stdio.h> #include<stdlib.h> #include<malloc.h> typedef struct LNode { int item; LNode *next;//注意,這裡要用自己的型別宣告一個指標 }LNode; //這個宣告建立了一個連結串列節點的結構體,包括資料域個指標域 //LNode是一個結構變數,可以用來計算結構體佔用的記憶體 //宣告一個指向連結串列節點的指標 typedef struct LNode *LinkList; int main(int argc,char *argv[])//使用引數之後要從dos介面執行並輸入引數 { int N,M; int i; N = atoi(argv[1]); M = atoi(argv[2]); LinkList Lhead,p,q;//定義三個指向連結串列結構的指標 //將malloc()的返回值強制轉換為LinkList型別,不可少 Lhead = (LinkList)malloc(sizeof(LNode));//為頭結點分配空間 if(!Lhead) return 1;//分配記憶體空間失敗 Lhead->item = 1; Lhead->next = Lhead; p = Lhead; for(i = 2; i <= N; i++) { q = (LinkList)malloc(sizeof(LNode));//重新申請一個節點空間 if(!q) return 1; q->next = p->next; p->next = q;//插入一個節點 q->item = i; p = q;//這樣下次迴圈的時候節點可以接在本次節點的後面 } //此時q是最後一個節點 while(q != q->next)//直到指向自己,也就是說剩下一個 { for(i= 1; i < M; i++) { q = q->next; //printf("%d",q->item); } //printf(" "); p = q->next; printf("刪除節點: %d\n",p->item); q->next = q->next->next;//刪除一個節點 N--; free(p);//及時釋放記憶體 } printf("最後剩下的節點:%d\n",q->item); free(q); while(1); }
最後上傳一個執行結果截圖