一、實驗目的
本實驗是有關線性表的鏈式儲存結構的應用,通過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 ...