約瑟夫環問題

2021-09-27 08:06:00 字數 1844 閱讀 7679

(這是乙個比較簡單的鍊錶入門小練習,記錄一下整個學習和**進步的過程。)

題目:問題描述為:編號為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報數,如此下去,直到所有人...