首页 > 代码库 > 【c语言】数据结构(约瑟夫生者死者游戏的问题)

【c语言】数据结构(约瑟夫生者死者游戏的问题)

约瑟夫生者死者游戏:30个旅客同乘一条船,因为严重超载,加上风高浪大,危险万分;因此船长告诉大家,只有将全船一半的旅客投入海中,其余人才能幸免遇难。无奈,大家只得同意这种办法,并议定30个人围成一圈,由第一个人开始,依次报数,数到第9个人,就把他投入大海中,然后从他的下一个人开始从1数起,数到第9个人,再将她投入大海,如此循环,直到剩下15个人乘客为止。问哪些位置是将被扔到大海的位置。

解法有许多种,可以用数组,应为涉及到删除操作,数组(顺序线性表)比较麻烦,但不必要删除,只需要给跳船的人(元素),赋一个值来区分就好了。

当然也可以用循环链表来做,如下;

 

 1 #include<stdio.h>
 2 #include<stdlib.h>
 3 struct DuLNOde{
 4 
 5     int date;
 6     struct DuLNOde * next;
 7 };
 8 int main()
 9 {
10     struct DuLNOde *q=NULL;
11     struct DuLNOde *p=NULL;
12     struct DuLNOde *z=NULL;
13     q=(struct DuLNOde*)malloc(sizeof(struct DuLNOde));
14     if(!q)
15         exit(0);
16     p=q;
17     p->date=1;
18     p->next=p;
19     for(int i=2;i<=30;i++)
20     {
21         z=(struct DuLNOde*)malloc(sizeof(struct DuLNOde));
22         if(!z)
23             exit(0);
24         z->date=i;
25         z->next=p->next;
26         p->next=z;
27         p=p->next;
28     }
29     p=q;
30     for(int i=0;i<15;i++)
31     {
32         for(int j=1;j<8;j++)
33            p=p->next;
34         printf("%d\n",p->next->date);
35         p->next=p->next->next;
36         p=p->next;
37 
38     }
39 }

 

输出结果如下:

9
18
27
6
16
26
7
19
30
12
24
8
22
5
23

  

 

【c语言】数据结构(约瑟夫生者死者游戏的问题)