迴圈鍊錶實現約瑟夫環(C語言)

2021-10-24 04:04:34 字數 1123 閱讀 5788

約瑟夫環問題,是乙個經典的迴圈鍊錶題。

約瑟夫環問題描述:已知 n 個人(分別用編號 1,2,3,…,n 表示)圍坐在一張圓桌周圍,從編號為 k 的人開始順時針報數,數到 m 的那個人出列;他的下乙個人又從 1 開始,還是順時針開始報數,數到 m 的那個人又出列;依次重複下去,直到圓桌上剩餘乙個人。輸出的最後乙個人即為圓桌剩餘的一人。

#include

#include

typedef

struct lnodeclinklist;

clinklist *

creat

(int n)

end->next=head;

return head;

}void

findandkillk

(clinklist * head,

int k,

int m)

p = head;

//找到編號為k的人

while

(p->data != k)

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

while

(p->next != p)

tail->next = p->next;

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

printf

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

, p->data)

;free

(p);

p = tail->next;

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

}printf

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

, p->data)

;free

(p);

}int

main()

輸出結果

輸入圓桌上的人數:

5從第幾個人開始報數(k>

1且k<

5):1

數到幾的人出列:2

出列人的編號為:

2出列人的編號為:

4出列人的編號為:

1出列人的編號為:

5出列人的編號為:

3

迴圈鍊錶實現約瑟夫環(c語言)

問題描述如下 編號為1,2 n的n個人按順時針方向圍坐一圈,每人持有乙個密碼。一開始人選乙個正整數作為報數上限值m,從第乙個人開始按順時針方向自1開始報數,報到m時停止報數,報m的人出列,將他的密碼作為新的m值,從他在順時針方向的下乙個人開始重新從1報數,直到所有人出列。設計程式求出列順序。問題分析...

C語言迴圈順序鍊錶實現約瑟夫環

include include typedef struct sssone 初始化結點的方法 one initialize int n 尾結點指向頭結點 y next s 返回首結點位址 return s void find one s,int k,int m one w s 找到開始數數的人的編號...

迴圈鍊錶實現約瑟夫環(C實現)

include includetypedef struct jonode node struct jonode 迴圈鍊錶核心 node josephus int m,int n node head,p1,p2 int cnt 0 int n 0 while n else p2 next head 迴...