已知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報數,如此下去,直到所...