c语言程序 生死游戏(帮忙改错)
这不就是约瑟夫问题么...
1 #include <stdio.h>
2 #include <stdlib.h>
3
4 typedef struct mk_node
5 {
6 int n;
7 struct mk_node *next;
8 }Node;
9
10 typedef struct
11 {
12 int size;
13 Node *head;
14 }List;
15
16 int main(int argc,char *argv[])
17 {
18 List *list=malloc(sizeof(List));
19 list->head=malloc(sizeof(Node));
20 list->size=0;
21 list->head->next=NULL; //创建链表
22
23 int N,S,M;
24 scanf("%d %d %d",&N,&S,&M);
25 Node node[N];
26 int i;
27 for(i=0;i<N-1;i++)
28 {
29
30 node[i].next=node+i+1;
31 node[i].n=i+1;
32 }
33 node[N-1].next=node;
34 list->head->next=node;
35 list->size=N; //链表内添加节点 并使其循环
36
37 for(i=0;i<N;i++)
38 {
39 if(node[i].n==S)
40 break;
41 } //找到S对应的节点
42
43 Node *temp=node+i;
44 Node *temp_1=temp;
45
46 for(i=1;;i++) //循环找出要悲剧的家伙
47 {
48 if(list->size==1) //判断到只有一个节点时 退出循环
49 break;
50 if(i%M==0) //从S节点开始,数到能被M整除的数字就删除一个节点
51 {
52 temp_1->next=temp->next;
53 temp=temp_1;
54 list->size--;
55 list->head->next=temp; //为了不使头结点指向空处,其实头结点什么的就不该设置嘛 不过链表总要来下吧
56 }
57 temp_1=temp;
58 temp=temp->next;
59
60 }
61 temp->next=NULL;
62 printf("%d\n",temp->n); //输出唯一的节点的n的值
63 return 0;
64 }
65
这是我自己写的
/question/532975279?&oldq=1#answer-1345483861