迴圈鍊錶練習 一 約瑟夫環

2021-10-04 19:49:26 字數 1335 閱讀 5363

約瑟夫環問題,是乙個經典的迴圈鍊錶問題,題意是:已知 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 *

initlist

(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)

/*從鍊錶上將p結點摘下來*/

tail->next=p->next;

printf

("出列人的編號為:%d\n"

,p->number)

;free

(p);

/*繼續使用p指標指向出列編號的下乙個編號,遊戲繼續*/

p=tail->next;

}printf

("勝利的人的編號為:%d\n"

,p->number)

;free

(p);

}int

main()

測試結果

迴圈鍊錶(約瑟夫環)

約瑟夫環是乙個數學的應用問題 已知n個人 以編號1,2,3.n分別表示 圍坐在一張圓桌周圍。從編號為k的人開始報數,數到m的那個人出列 他的下乙個人又從1開始報數,數到m的那個人又出列 依此規律重複下去,直到圓桌周圍的人全部出列。要通過輸入n,m,k三個正整數,來求出列的序列。這個問題採用的是典型的...

迴圈鍊錶應用 約瑟夫環

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

單向迴圈鍊錶 約瑟夫環

寫個約瑟夫環,檢驗一下自己的學習狀況.include define elemtype int typedef struct lnodesqlist void initlist sqlist l,elemtype n void round sqlist l,int m,int n int main v...