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

2021-08-28 13:31:20 字數 954 閱讀 2203

問題描述如下:

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

問題分析:

資料結構的選擇:

將編號num,密碼data,下個人的指標next封裝成乙個結構體,代表乙個「人」。圍成一圈可以用迴圈鍊錶實現,但是尾插法構造鍊錶時尾元結點指向首元結點會避免繞圈時遇到頭結點的情況。刪除操作與判空操作一同寫在main函式中。

若p->next=p則該結點p已經是最後乙個人,所以在迴圈結束後不要忘記最後乙個剩下的人。刪除操作一定要先找到要刪元素的前驅結點,前驅結點指向p->next->next.

完整**如下:

#define error -1

#define true 1

#define overflow -1

typedef int elemtype;

typedef int status;

typedef struct lnodelnode, *linklist;

linklist initlinklist(linklist &l)

void createfromtail(linklist l)

else }}

int main()

q=p->next;

p->next=q->next;

m=q->data;

cout<

free(q);

} cout<

}

效果如下:

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

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

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 迴...