迴圈鍊錶 約瑟夫環問題

2021-08-07 03:02:20 字數 1291 閱讀 4107

約瑟夫環問題,是乙個經典的迴圈鍊錶問題,題意是:已知 n 個人(以編號1,2,3,…,n分別表示)圍坐在一張圓桌周圍,從編號為 k 的人開始順時針報數,數到 m 的那個人出列;他的下乙個人又從 1 還是順時針開始報數,數到 m 的那個人又出列;依次重複下去,要求找到最後出列的那個人。

例如有 5 個人,要求從編號為 3 的人開始,數到 2 的那個人出列:

出列順序依次為:

編號為 3 的人開始數 1,然後 4 數 2,所以 4 先出列;

4 出列後,從 5 開始數 1,1 數 2,所以 1 出列;

1 出列後,從 2 開始數 1,3 數 2,所以 3 出列;

3 出列後,從 5 開始數 1,2 數 2,所以 2 出列;

最後只剩下 5 自己,所以 5 出列。

**實現:

#include 

#include

typedef

struct nodeperson;

person * initlink(int n)

cyclic->next=head;//首尾相連

return head;

}void findandkillk(person * head,int k,int m)

person * p=head;

//找到編號為k的人

while (p->number!=k)

//從編號為k的人開始,只有符合p->next==p時,說明鍊錶中除了p結點,所有編號都出列了,

while (p->next!=p)

tail->next=p->next;//從鍊錶上將p結點摘下來

printf("出列人的編號為:%d\n",p->number);

free(p);

p=tail->next;//繼續使用p指標指向出列編號的下乙個編號,遊戲繼續

}printf("出列人的編號為:%d\n",p->number);

free(p);

}int main()

輸出:

輸入圓桌上的人數n

:5從第k人開始報數(k>1且k

<5):3

數到m的人出列:2

出列人的編號為:4

出列人的編號為:1

出列人的編號為:3

出列人的編號為:2

出列人的編號為:5

約瑟夫環問題(迴圈鍊錶)

這是一道比較經典的迴圈鍊錶問題,在華為上機筆試中也出現過。約瑟夫環是乙個數學的應用問題 已知n個人 以編號1,2,3.n分別表示 圍坐在一張圓桌周圍。從編號為k的人開始報數,數到m的那個人出列 他的下乙個人又從1開始報數,數到m的那個人又出列 依此規律重複下去,直到圓桌周圍的人全部出列。includ...

約瑟夫環問題(迴圈鍊錶)

轉 約瑟夫環 是乙個數學的應用問題 已知n個人 以編號1,2,3.n分別表示 圍坐在一張圓桌周圍。從編號為k的人開始報數,數到m的那個人出列 他的下乙個人又從1開始報數,數到m的那個人又出列 依此規律重複下去,直到圓桌周圍的人全部出列。include include typedef struct n...

迴圈鍊錶 約瑟夫環問題

正好這幾天在看資料結構,覺得鍊錶應用挺廣的,特寫一例項。問題描述 選首領。n個遊戲者圍成一圈,從第乙個開始順序報數1,2,3.凡報到3者退出圈子,最後留在圈中的人為首領。思路 建立乙個包含n個節點的單迴圈鍊錶來模擬n個人圍成的圈。節點的資料域存放遊戲者的編號。在程式中,以刪除節點模擬人退出圈子的處理...