標籤:鏈式 鏈表 初始化 資料 計算 人才 rand style 儲存結構
本周的作業還算挺好玩。。約瑟夫生死遊戲嘛。
老師要抽籤選擇每個組對應的資料結構。結果寶寶抽到了單鏈表。。。。
一、項目簡介
約瑟夫生者死者遊戲的大意是:30個旅客同乘一條船,因為嚴重超載,加上風高浪大,危險萬分;因此船長告訴乘客,只有將全船一半的旅客投入海中,其餘人才能倖免遇難。無奈,大家只得同意這種辦法,並議定30個人圍成一圈,由第一個人開始,依次報數,數到第9人,便把他投入大海中,然後從他的下一個人數起,數到第9人,再將他投入大海,如此迴圈,直到剩下15個乘客為止。問哪些位置是將被扔下大海的位置。
二、設計思路
約瑟夫環問題是演算法設計中的一個經典問題,是順序編號的一組n個人圍坐一圈,從第1個人按一定方向順序報數,在報到m時該人出列,然後按相同方法繼續報數,直到所有人出列。設計演算法求約瑟夫環中人員的出列順序。
線性表、隊列是一種常用的資料結構,有順序和鏈式兩種儲存結構,在實際中應用十分廣泛,而鏈表又分為單鏈表和迴圈鏈表,隊列又分為鏈式隊列和迴圈隊列。這些資料結構都可用來解決約瑟夫環問題。
三、 基本要求
1、選擇合適的儲存結構,建立線性表;
2、利用單鏈表求解約瑟夫環問題;
四、測試資料
約瑟夫環的開始位置、長度、報數可以從鍵盤輸入合法資料,或者隨機產生。
代碼如下:
我的資料是隨機產生滴。
1 #include <cstdio> 2 #include <ctime> 3 #include <cstdlib> 4 5 int kk=0; 6 int ll; 7 8 typedef struct people 9 { 10 int num; 11 }PEO; 12 typedef struct Node 13 { 14 PEO data; 15 struct Node * next; 16 }Node; 17 18 Node *InitList(Node *L)//初始化單鏈表 19 { 20 L=(Node *)malloc(sizeof(Node)); 21 L->next=NULL; 22 return L; 23 } 24 25 void CreateFormTail(Node *L)//尾插法 26 { 27 Node *s,*r; 28 r=L; 29 int aa=30-ll+1+1; 30 for(int i=1;i<=30;i++){ 31 s=(Node *)malloc(sizeof(Node)); 32 s->data.num=aa; 33 r->next=s; 34 r=s; 35 if(i==30){ 36 r->next=NULL; 37 } 38 if(aa==30) 39 aa=1; 40 else 41 aa++; 42 43 } 44 } 45 void Printf(Node *L) 46 { 47 int q=0; 48 Node *p=L->next; 49 while(p!=NULL) 50 { 51 q++; 52 printf("%d\n",p->data.num); 53 p=p->next; 54 } 55 printf("單鏈表長度為%d\n",q); 56 } 57 58 void sou(Node *L) 59 { 60 Node *s,*r,*pre; 61 r=L; 62 s=r->next; 63 for(int i=1;i<=30;i++){ 64 if(s->data.num==1) 65 break; 66 else 67 r=r->next; 68 s=r->next; 69 70 } 71 printf("被丟下水的報數按順序為\n"); 72 while(kk<15){ 73 for(int j=1;j<9;j++){ 74 r=r->next; 75 s=r->next; 76 if(s->next==NULL){ 77 s->next=L->next; 78 } 79 if(r->next==NULL){ 80 r->next=L->next; 81 } 82 } 83 printf("%d\n",s->data.num); 84 s=s->next; 85 pre=r->next; 86 r->next=s; 87 free(pre); 88 kk++; 89 } 90 } 91 92 int main() 93 { 94 srand(time(NULL));//初始化隨機化種子 95 ll=rand()%30+1; 96 printf("第%d個人從1開始報數\n",ll); 97 printf("本題條件30個人從1開始數,數到第9個人就丟下水,要丟下去15個人\n"); 98 Node *L=NULL; 99 L=InitList(L);100 CreateFormTail(L);101 Printf(L);102 sou(L);103 104 return 0;105 }
約瑟夫生死遊戲(單鏈表實現)