约瑟夫问题求解代码
约瑟夫问题: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 }

浙公网安备 33010602011771号