约瑟夫问题求解代码

约瑟夫问题:N个学生围成一圈玩狼人杀,从第一个开始报数,第M个将被狼人杀掉,最后剩下一个,其余人都将被杀掉。例如N=6,M=5,被杀掉的顺序是:5,4,6,2,3,1。

可以用循环链表实现:

C语言代码

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include "circlelist.h"
 4 typedef struct
 5 {
 6     CircleListNode* node;
 7     int num;
 8     char name[64];
 9 }Student;
10 void main()
11 {
12     int i = 0;
13     Student s1, s2, s3, s4, s5, s6;
14     s1.num = 1;
15     s2.num = 2;
16     s3.num = 3;
17     s4.num = 4;
18     s5.num = 5;
19     s6.num = 6;
20     CircleList* list = CircleList_Create();
21     CircleList_Insert(list, (CircleListNode*)&s1, CircleList_Length(list));
22     CircleList_Insert(list, (CircleListNode*)&s2, CircleList_Length(list));
23     CircleList_Insert(list, (CircleListNode*)&s3, CircleList_Length(list));
24     CircleList_Insert(list, (CircleListNode*)&s4, CircleList_Length(list));
25     CircleList_Insert(list, (CircleListNode*)&s5, CircleList_Length(list));
26     CircleList_Insert(list, (CircleListNode*)&s6, CircleList_Length(list));
27     printf("学生排列的顺序是:\n");
28     for (i = 0; i<CircleList_Length(list); i++)
29     {
30         //获取游标所指元素,然后游标下移
31         Student* stu = (Student*)CircleList_Next(list);
32         printf("%d ", stu->num);
33     }
34     printf("\n");
35     printf("被狼人杀掉的顺序是:\n");
36     CircleList_Reset(list);//重置游标
37     while (CircleList_Length(list) > 0)
38     {
39         Student* stu = NULL;
40         for (i = 1; i<5; i++)
41         {
42             CircleList_Next(list);
43         }
44         stu= (Student* )CircleList_Current(list);//返回游标当前值
45         printf("%d ", stu->num);
46         CircleList_DeleteNode(list, (CircleListNode*)stu);
47     }
48     system("pause");
49     return;
50 }

 

posted @ 2018-03-16 09:30  Alexadar  阅读(198)  评论(0)    收藏  举报