鍊錶的應用 約瑟夫環問題

2021-09-01 05:12:09 字數 2296 閱讀 7430

一、實驗目的

本實驗是有關線性表的鏈式儲存結構的應用,通過c語言中提供的結構指標來儲存線性表,利用malloc函式動態地分配儲存空間。

通過對本實驗的學習,可以理解線性表在鏈序儲存結構下的操作方法。

二、實驗內容

設計乙個程式求出約瑟夫環的出列順序。約瑟夫問題的一種描述是:編號為1,2,…,n的n個人按順時針方向圍坐一圈,每個人持有乙個密碼(正整數)。一開始任選乙個正整數作為報數上限值m,從第乙個人開始按順時針方向自1開始順序報數,報到m時停止報數。報m的人出列,將他的密碼作為新的m 值,從他在順時針方向上的下乙個人開始重新從1報數,如此下去,直到所有人全部出列為止。例如,n=7,7個人的密碼依次為:3,1,7,2,4,8,4,m的初值取6,則正確的出列順序應為6,1,4,7,2,3,5。要求使用單向迴圈鍊錶模擬此出列過程。

三、程式分析

約瑟夫環的大小是變化的,因此相應的結點也是變化的,使用鏈式儲存結構可以動態的生成其中的結點,出列操作也非常簡單。用單向迴圈鍊錶模擬其出列順序比較合適。

用結構指標描述每個人:

struct joseph

;1)初始化約瑟夫環:

呼叫函式struct joseph *creat()生成初始約瑟夫環。在該函式中使用head 指向表頭。輸入序號為0時結束,指標p1指向的最後結束序號為0的結點沒有加入到鍊錶中,p2 指向最後乙個序號為非0 的結點(最後乙個結點)。

2)報數出列:

呼叫函式voil sort(struct joseph * head,int m),使用條件p1->next!=p1判斷單向鍊錶非空,使用兩個指標變數p1和p2,語句p2=p1;p1=p1->next;移動指標,計算結點數(報數);結點p1出列時直接使用語句:p2->next=p1->next,取出該結點中的密碼作為新的迴圈終值。

四、程式源**

#include

#include

#define len sizeof(struct joseph)

//by jelly liu

struct joseph

;struct joseph *

creat()

p2->next=head;

/* int i=0;

for(;inum;p2=p2->next,i++)

printf("%d,%d",p2->num,p2->secret);

*/return

(head);}

void

sort

(struct joseph *head,

int m)

else p1=p1->next;

}printf

("%d"

,p1->num);}

intmain

(int argc,

char

*argv)

#define null 0

#define length sizeof(struct joseph)

#include

"stdlib.h"

#include

"stdio.h"

struct joseph

;/*定義結點num為序號,secret為密碼*/

/*建立初始鍊錶函式*/

struct joseph *

creat()

p2->next=head;

return

(head);}

/*報數出列*/

void

sort

(struct joseph * head,

int m)

p2->next=p1->next;

m=p1->secret;

printf

("%d "

,p1->num)

;p1=p2->next;}if

(p1->next=

=p1)

printf

("%d "

,p1->num);}

main()

五、實驗結果

最後程式執行結果如下所示:

輸入資料:資料格式為序號,密碼

輸入0,0為結束

1,3↙《回車》

2,1↙《回車》

3,7↙《回車》

4,2↙《回車》

5,4↙《回車》

6,8↙《回車》

7,4↙《回車》

0,0↙《回車》

輸入m值

6↙《回車》

出列的序號是

6→1→4→7→2→3→5

迴圈鍊錶應用 約瑟夫環

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

迴圈鍊錶的應用 約瑟夫環

約瑟夫環 時 限 500 ms 記憶體限制 2000 k 總時限 3000 ms 描述 約瑟夫環 編號為1,2,3,n的n個人按順時針方向圍坐一圈。任選乙個正整數作為報數上限m,從第乙個人開始按順時針方向自1開始順序報數,報到m時停止報數。報m的人出列,從他在順時針方向上的下乙個人開始重新從1報數,...

迴圈鍊錶的應用 約瑟夫環

題目 報數,共n個人 從1編號,依次報號,報到m出隊,再接著從下乙個人開始數,依次輸出出隊的人。include include typedef struct n node node creat int n 建立n個節點的鍊錶 p next head return head 刪除報號為m的 void ...