循环链表,数组标志位,静态链表。
#include <stdio.h>#include <stdlib.h>/*循环链表实现约瑟夫环问题*//*typedef struct node {int data;struct node* next;}Node,*Link; //定义结构体链表void displayMonkey(); //定义显示猴子编号函数int n, m, i; //n表示猴子数量 m表示从1开始报到的数并退出int count; //报数记录count = 1;int main(void){Link head;Link flag;Link p, q;head = (Link)malloc(sizeof(struct node));flag = head;printf("请输入(猴子个数,报到的数)\n");scanf_s("%d,%d", &n, &m);fflush(stdin);for (i = 1; i <= n; i++) //尾插法 插入猴子 使链表 猴子编号 从小到大输出{flag->next = (Link)malloc(sizeof(struct node));flag->next->data = i;flag = flag->next;}flag->next = head->next; //构建循环链表,使尾指针的下一个节点指向头指针的下一个节点q = flag; //初始化后指针p = head->next; //初始化前指针displayMonkey(head);free(head); //释放头指针内存while (n > 1){//p指针为报到的数的位置,如果没到m则前后指针向后挪一位if (count != m) {q = p;p = p->next;++count;}//p=m, 讲q指向p的后移位。并释放p。else {q->next = p->next; //这条需注意不是 q=p->nextfree(p);p = q->next; //这条需注意n--;count = 1;}}printf("剩下的猴子编号为:%d",p->data);free(q);free(p);return 0;}void displayMonkey(Link head) {for (i = 1; i <= n; i++){head = head->next;printf("猴子编号:%d", head->data);printf("\n");}return 0;}*//*数组标志位实现方式*//*int main(void) {int pos, count, n, m,i,number;int mon[301] = { 0 };printf("请输入 猴子个数,报到的数 -- 输入 0,0 结束程序\n");while (~scanf_s("%d,%d", &n, &m)){if (n == 0 || m == 0){return 0;}for (i = 0; i < n; i++){mon[i] = i + 1;printf("猴子编号:%d\n", mon[i]);}number = n;pos = 0;count = 1;while (number > 1){if (mon[pos] > 0){if (count == m){mon[pos] = 0;number--;count = 1;pos = (pos + 1) % n;}else{count++;pos = (pos + 1) % n;}}else{pos = (pos + 1) % n;}}for (i = 0; i < n; i++){if (mon[i] > 0) {printf("最后的猴子编号:%d\n", mon[i]);}}}return 0;}*//*静态链表实现方法*/#define MAXSIZE 301#define status int#define OK 1typedef struct MonList{int MonkN;int cur;}StaticLinkList[MAXSIZE];status InitList(StaticLinkList space);status MonkeyList(StaticLinkList space,int i);status ListDelete(StaticLinkList space,int pos);status DisplayList(StaticLinkList space);void Free_SSL(StaticLinkList space, int k);int Malloc_SLL(StaticLinkList space);int ListLenghth(StaticLinkList space);int n, m;int main(void) {int i;int number,count;count = 1;StaticLinkList MokeyList;printf("请输入 猴子个数,报到的数 -- 输入 0,0 结束程序\n");while (~scanf_s("%d,%d", &n, &m)){fflush(stdin);number = n;if (n == 0 || m == 0){return 0;}InitList(MokeyList);MonkeyList(MokeyList,n);DisplayList(MokeyList);int pos;pos = 1;while (number > 1){if (MokeyList[pos].MonkN > 0){if (count == m){ListDelete(MokeyList,pos);number --;count = 1;pos = MokeyList[pos].cur;}else{pos = MokeyList[pos].cur;count++;}}else {pos = MokeyList[pos].cur;}}int i;for (i = 1; i <= n; i++){if (MokeyList[i].MonkN != 0){printf("最后的猴子编号:%d\n", MokeyList[i].MonkN);}}for (i = n; i >= 1; i--) {Free_SSL(MokeyList, i);}}return 0;}status InitList(StaticLinkList space) {int i;for (i = 0; i < MAXSIZE - 1; i++) space[i].cur = i + 1;space[MAXSIZE].cur = 0;return OK;}status MonkeyList(StaticLinkList space, int n) {int j;for (j = Malloc_SLL(space); j < n; j++){space[j].MonkN = j;}space[j].MonkN = j;if (j == n){space[j].cur = 1;}return 1;}status ListDelete(StaticLinkList space, int pos) {space[pos].MonkN = 0;}status DisplayList(StaticLinkList space) {int i = 1;for (i = i; i <= n; i++)printf("猴子编号:%d\n",space[i].MonkN);}int Malloc_SLL(StaticLinkList space) {int i = space[0].cur;if (space[0].cur)space[0].cur = space[i].cur;return i;}void Free_SSL(StaticLinkList space, int k){space[k].cur = space[0].cur;space[0].cur = k;}
