循环链表,数组标志位,静态链表。
#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->next
free(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 1
typedef 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;
}