首页 > 代码库 > 约瑟夫生死游戏(单链表实现)
约瑟夫生死游戏(单链表实现)
本周的作业还算挺好玩。。约瑟夫生死游戏嘛。
老师要抽签选择每个组对应的数据结构。结果宝宝抽到了单链表。。。。
一、项目简介
约瑟夫生者死者游戏的大意是: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 }
约瑟夫生死游戏(单链表实现)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。