約瑟夫環問題,是乙個經典的迴圈鍊錶問題,題意是:已知 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個人圍成的圈。節點的資料域存放遊戲者的編號。在程式中,以刪除節點模擬人退出圈子的處理...