循环链表,数组标志位,静态链表。

    1. #include <stdio.h>
    2. #include <stdlib.h>
    3. /*循环链表实现约瑟夫环问题*/
    4. /*
    5. typedef struct node {
    6. int data;
    7. struct node* next;
    8. }Node,*Link; //定义结构体链表
    9. void displayMonkey(); //定义显示猴子编号函数
    10. int n, m, i; //n表示猴子数量 m表示从1开始报到的数并退出
    11. int count; //报数记录
    12. count = 1;
    13. int main(void)
    14. {
    15. Link head;
    16. Link flag;
    17. Link p, q;
    18. head = (Link)malloc(sizeof(struct node));
    19. flag = head;
    20. printf("请输入(猴子个数,报到的数)\n");
    21. scanf_s("%d,%d", &n, &m);
    22. fflush(stdin);
    23. for (i = 1; i <= n; i++) //尾插法 插入猴子 使链表 猴子编号 从小到大输出
    24. {
    25. flag->next = (Link)malloc(sizeof(struct node));
    26. flag->next->data = i;
    27. flag = flag->next;
    28. }
    29. flag->next = head->next; //构建循环链表,使尾指针的下一个节点指向头指针的下一个节点
    30. q = flag; //初始化后指针
    31. p = head->next; //初始化前指针
    32. displayMonkey(head);
    33. free(head); //释放头指针内存
    34. while (n > 1)
    35. {
    36. //p指针为报到的数的位置,如果没到m则前后指针向后挪一位
    37. if (count != m) {
    38. q = p;
    39. p = p->next;
    40. ++count;
    41. }
    42. //p=m, 讲q指向p的后移位。并释放p。
    43. else {
    44. q->next = p->next; //这条需注意不是 q=p->next
    45. free(p);
    46. p = q->next; //这条需注意
    47. n--;
    48. count = 1;
    49. }
    50. }
    51. printf("剩下的猴子编号为:%d",p->data);
    52. free(q);free(p);
    53. return 0;
    54. }
    55. void displayMonkey(Link head) {
    56. for (i = 1; i <= n; i++)
    57. {
    58. head = head->next;
    59. printf("猴子编号:%d", head->data);
    60. printf("\n");
    61. }
    62. return 0;
    63. }*/
    64. /*数组标志位实现方式*/
    65. /*
    66. int main(void) {
    67. int pos, count, n, m,i,number;
    68. int mon[301] = { 0 };
    69. printf("请输入 猴子个数,报到的数 -- 输入 0,0 结束程序\n");
    70. while (~scanf_s("%d,%d", &n, &m))
    71. {
    72. if (n == 0 || m == 0)
    73. {
    74. return 0;
    75. }
    76. for (i = 0; i < n; i++)
    77. {
    78. mon[i] = i + 1;
    79. printf("猴子编号:%d\n", mon[i]);
    80. }
    81. number = n;
    82. pos = 0;
    83. count = 1;
    84. while (number > 1)
    85. {
    86. if (mon[pos] > 0)
    87. {
    88. if (count == m)
    89. {
    90. mon[pos] = 0;
    91. number--;
    92. count = 1;
    93. pos = (pos + 1) % n;
    94. }
    95. else
    96. {
    97. count++;
    98. pos = (pos + 1) % n;
    99. }
    100. }
    101. else
    102. {
    103. pos = (pos + 1) % n;
    104. }
    105. }
    106. for (i = 0; i < n; i++)
    107. {
    108. if (mon[i] > 0) {
    109. printf("最后的猴子编号:%d\n", mon[i]);
    110. }
    111. }
    112. }
    113. return 0;
    114. }
    115. */
    116. /*静态链表实现方法*/
    117. #define MAXSIZE 301
    118. #define status int
    119. #define OK 1
    120. typedef struct MonList{
    121. int MonkN;
    122. int cur;
    123. }StaticLinkList[MAXSIZE];
    124. status InitList(StaticLinkList space);
    125. status MonkeyList(StaticLinkList space,int i);
    126. status ListDelete(StaticLinkList space,int pos);
    127. status DisplayList(StaticLinkList space);
    128. void Free_SSL(StaticLinkList space, int k);
    129. int Malloc_SLL(StaticLinkList space);
    130. int ListLenghth(StaticLinkList space);
    131. int n, m;
    132. int main(void) {
    133. int i;
    134. int number,count;
    135. count = 1;
    136. StaticLinkList MokeyList;
    137. printf("请输入 猴子个数,报到的数 -- 输入 0,0 结束程序\n");
    138. while (~scanf_s("%d,%d", &n, &m))
    139. {
    140. fflush(stdin);
    141. number = n;
    142. if (n == 0 || m == 0)
    143. {
    144. return 0;
    145. }
    146. InitList(MokeyList);
    147. MonkeyList(MokeyList,n);
    148. DisplayList(MokeyList);
    149. int pos;
    150. pos = 1;
    151. while (number > 1)
    152. {
    153. if (MokeyList[pos].MonkN > 0)
    154. {
    155. if (count == m)
    156. {
    157. ListDelete(MokeyList,pos);
    158. number --;
    159. count = 1;
    160. pos = MokeyList[pos].cur;
    161. }
    162. else
    163. {
    164. pos = MokeyList[pos].cur;
    165. count++;
    166. }
    167. }
    168. else {
    169. pos = MokeyList[pos].cur;
    170. }
    171. }
    172. int i;
    173. for (i = 1; i <= n; i++)
    174. {
    175. if (MokeyList[i].MonkN != 0)
    176. {
    177. printf("最后的猴子编号:%d\n", MokeyList[i].MonkN);
    178. }
    179. }
    180. for (i = n; i >= 1; i--) {
    181. Free_SSL(MokeyList, i);
    182. }
    183. }
    184. return 0;
    185. }
    186. status InitList(StaticLinkList space) {
    187. int i;
    188. for (i = 0; i < MAXSIZE - 1; i++) space[i].cur = i + 1;
    189. space[MAXSIZE].cur = 0;
    190. return OK;
    191. }
    192. status MonkeyList(StaticLinkList space, int n) {
    193. int j;
    194. for (j = Malloc_SLL(space); j < n; j++)
    195. {
    196. space[j].MonkN = j;
    197. }
    198. space[j].MonkN = j;
    199. if (j == n)
    200. {
    201. space[j].cur = 1;
    202. }
    203. return 1;
    204. }
    205. status ListDelete(StaticLinkList space, int pos) {
    206. space[pos].MonkN = 0;
    207. }
    208. status DisplayList(StaticLinkList space) {
    209. int i = 1;
    210. for (i = i; i <= n; i++)
    211. printf("猴子编号:%d\n",space[i].MonkN);
    212. }
    213. int Malloc_SLL(StaticLinkList space) {
    214. int i = space[0].cur;
    215. if (space[0].cur)
    216. space[0].cur = space[i].cur;
    217. return i;
    218. }
    219. void Free_SSL(StaticLinkList space, int k){
    220. space[k].cur = space[0].cur;
    221. space[0].cur = k;
    222. }