迴圈鍊錶來實現約瑟夫環問題 c語言

2021-10-07 01:53:56 字數 1120 閱讀 7239

已知n個人(以編號1,2,3,…,n分別表示)圍坐在一張圓桌周圍。從編號為k的人開始報數,數到m的那個人出列;他的下乙個人又從k開始報數,數到m的那個人又出列;依次規律重複下去,直到圓桌周圍的人全部出列。

解:本題是約瑟夫環問題的實際場景。可用迴圈鍊錶來實現。問題的核心步驟為: 建立無頭結點的迴圈鍊錶; 確定第乙個報數人的位置; 不斷從鍊錶中刪除結點,直到鍊錶為空。

**如下:

#include

#include

//不帶頭結點的迴圈鍊錶 //約瑟夫環問題

typedef

struct lnode

lnode,

*linklist;

void josephus (

int n,

int k,

int m)

//n人數,k第乙個開始報數的人,m出列者喊到的數

p->next=head;

//找到尾結點,也就是第乙個結點的上乙個結點

linklist tail=head;

while

(tail-

>next!=head)

//找編號為k的人

p=head;

while

(p->data!=k)

//只有當p->next==p時,說明鍊錶中只剩p結點了

while

(p->next!=p)

tail-

>next=p-

>next;

printf

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

,p->data)

;free

(p);

//刪除p

p=tail-

>next;

//p指向刪除後的下乙個結點,重新進入迴圈

}//只剩p乙個結點

printf

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

,p->data)

;free

(p);

}int

main()

執行結果如下:

迴圈鍊錶實現約瑟夫環(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 迴...

迴圈鍊錶實現約瑟夫環

約瑟夫問題 有n個人圍坐一圈,從第k個人開始數,數到m的那個人出隊。知道最後乙個人出隊。有11個人,從第2個人開始數,數到3的那個人出隊。如下簡圖 這裡有兩個關鍵 1 建立迴圈佇列 不能有頭結點 2 隔m 1步取出該節點 程式如下 include using namespace std typede...

約瑟夫環 迴圈鍊錶實現

題目 約瑟夫環的一種描述為 編號為1,2,n的n個人按順時針方向圍坐一圈,每人持有乙個密碼 正整數 一開始任選乙個正整數作為報數上限值m,從第乙個人開始按順時針方向自1開始順序報數,報到m時停止報數。報m的人出列,將他的密碼作為新的m值,從他在順時針方向上的下乙個人開始重新從1報數,如此下去,直到所...