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