(這是乙個比較簡單的鍊錶入門小練習,記錄一下整個學習和**進步的過程。)
題目:問題描述為:編號為1,2,3,,,,n的n個人按順時針方向為坐在一張圓桌周圍,每人持有乙個密碼(整數)。一開始任選乙個正整數作為報數上限值m,從第乙個人開始按順時針方向自1開始報數,報到m時停止報數,報m的那個人出列,將其密碼作為新的m值,並從順時針方向的下乙個人開始重新從1報數,數到m的那個人又出列;如此下去,直到圓桌的人全部出列為止。
分析:演算法分析實現,在這裡採用單項迴圈鍊錶的資料結構,因為要進行反覆的刪除操作;令鍊錶的尾指標指向首元素的位址。每個人的資訊作為乙個節點,此節點中儲存著他們的編號和密碼。在下面的**中,編號我用id表示,密碼用了secret(其實是密碼的英語單詞在寫的時候沒想起來,,,,,就用了個秘密,,,?),每個節點除了指標域以外,還有兩個域儲存編號和密碼。
思路分析:
因為有n個人,所以第一步建立n個節點的單項迴圈鍊錶。因此我們要寫乙個建立單鏈表的函式,輸入編號和與之對應的密碼,[然後列印出鍊錶(整個的資訊),可以選作,為了觀察方便,思路更清晰還是寫一下比較好~]
從鍊錶的第乙個節點開始迴圈找尋下乙個節點,即迴圈到m的那個人。
輸出該節點的id(對應編號),將該節點的secret(密碼)作為新的m值迴圈下去,並刪除該節點。所以此處我們需要寫乙個根據m值迴圈獲取新節點的函式。
根據m值不斷從鍊錶中刪除節點,直到鍊錶為空。所以我們要有對應的判空操作。
自定義的結構體型別:
typedef struct node
node;
函式:void creatlist(node **,int);
void printlist(node *);
node *getnode(int ,int);
void runninglist(node **,int);
完整**塊
#include#include#include#define maxsize 50
typedef struct node
node;
void creatlist(node **,int);
void printlist(node *);
node *getnode(int ,int);
void runninglist(node **,int);
int main(void)
void creatlist(node **head,int n)
else
}}node *getnode(int id,int secret)
pnew->id=id; //傳送編號
pnew->secret=secret;//傳密碼
pnew->next=null;
return pnew;
} void printlist(node *phead)//列印建立好的鍊錶
else
while(p!=phead);
}} void runninglist(node **head,int secret) //執行
if(pre==pcur) x=0;
pdel=pcur;
pre->next=pcur->next;
pcur=pcur->next;
secret=pdel->secret;
//printf("出列");
printf("%d",pdel->id);
//printf("no.%d個人出列,密碼是%d\n",pdel->id,pdel->secret);
free(pdel);
} *head=null;
getchar();
}
約瑟夫問題 約瑟夫環
約瑟夫 問題 有時也稱為約瑟夫斯置換,是乙個出現在電腦科學和數學中的問題。在計算機程式設計的演算法中,類似問題又稱為約瑟夫環。又稱 丟手絹問題 據說著名猶太歷史學家 josephus有過以下的故事 在羅馬人占領喬塔帕特後,39 個猶太人與josephus及他的朋友躲到乙個洞中,39個猶太人決定寧願死...
約瑟夫問題 約瑟夫環
約瑟夫問題 有時也稱為約瑟夫斯置換,是乙個出現在電腦科學和數學中的問題。在計算機程式設計的演算法中,類似問題又稱為約瑟夫環。又稱 丟手絹問題 據說著名猶太歷史學家 josephus有過以下的故事 在羅馬人占領喬塔帕特後,39 個猶太人與josephus及他的朋友躲到乙個洞中,39個猶太人決定寧願死也...
約瑟夫環問題
約瑟夫環問題 問題描述 編號是1,2,n的n個人按照順時針方向圍坐一圈,每個人持有乙個密碼 正整數 一開始任選乙個正整數作為報數上限值m,從第乙個人開始順時針方向自1開始順序報數,報到m時停止報數。報m的人出列,將他的密碼作為新的m值,從他在順時針方向的下乙個人開始重新從1報數,如此下去,直到所有人...