首先用一个数组来存放猴子的编号,从1到m,然后按题目要求,用循环来实现猴子大王的选举
#include <stdio.h>
#include <stdlib.h>
#define OK 1
#define ERROR 0
#define OVERFLOW -2
typedef int Status;
typedef int ElemType; //定义数据元素类型
typedef struct CNode
{
ElemType data;
struct CNode *next;
}CNode;
CNode *monkey; //定义一个全局变量
Status Create_clist(CNode *clist,int n) //创建一个有n个节点的环形链表
{
CNode *p,*q,*head;
int i;
clist =NULL;
for (i=n;i>=1;i--)
{
p=(CNode *)malloc(sizeof(CNode));
p->data=n;
p->next=NULL;
head=p;
if (p==NULL)
return OVERFLOW; //存储分配失败
p->data=i;
p->next=clist;
clist=p;
if (i==n)
q=p; //用q指向链表的最后一个结点
}
q->next=clist; //把链表的最后一个节点的链域指向链表的第一个结点,构成循环链表
monkey=clist; //把创建好的循环链表头指针赋给全局变量
return OK;
}
Status Monkey(CNode *clist,int n)
{
int i;
int m;
CNode *p,*q;
if (!Create_clist(clist,n))
return ERROR; //起始位置错
p=monkey; //p指向创建好的循环链表
for (m=13;n>1;m--,n--)
{
if (m==1)
{
m=13;
}
for (i=0;i<m-1;i++) //找出第m-1个结点
p=p->next; //删除p->next结点
q=p->next;
p->next=q->next;
p=p->next;
free(q);
}
printf("%d ",p->data); //输出应出列的结点
clist=NULL; //删除最后一个结点
return OK;
}
int main()
{
int n;
CNode *clist;
clist=NULL; //初始化clist
printf("\n请输入猴的个数n:\n");
scanf("%d",&n);
Create_clist(clist,n); //创建一个有n个结点的循环链表clist
printf("\n猴王是:\n");
Monkey(clist,n);
return 0;
}