猴王问题 怎么大于14就不行了那
某森林中有n只猴子商量选猴王问题,所有猴子围坐在一圈,先从第一只猴子开始报数,报道13的猴子出列,紧接着下一个猴子进行新的一轮报数,报道12的猴子出列;依次重复下去,每一轮报数都比上一轮少1,直到报到数减为一之后,又从13开始报数,直到剩下一只猴子为止,这个猴子就是猴王。#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;
struct Cnode* Creat_clist(CNode*clist,int n)
{
CNode *p,*q;
int i;
clist=NULL;
for(i=n;i>=1;i--)
{
p=(CNode*)malloc(sizeof(CNode));
if(!p) exit(OVERFLOW); //内存分配失败
p->data=i;
p->next=clist;
clist=p;
if(i==n)
q=p; //用q指向链表最后一个节点
}
q->next=clist; //构成循环链表
return clist; //clist即为指向第一个节点的指针
}
Status Kingmonkey(CNode*clist)
{
CNode *p,*q,*l;
p=clist;
int m,i;m=13;
do
{
for(i=1;i<m-1;i++)
{ p=p->next; }
q=p->next; //q节点为要删除的节点
p->next=q->next;
p=p->next;
printf("输出要删除的节点:%d \n",q->data);
free(q);
m--;
i=1;
if(m==1&&p->next!=p)
{
l=p;
p->next=l->next;
p=p->next;
printf("输出要删除的xxxxx节点:%d",l->data);
free(l);
m=13;
}
}while(p!=p->next);
printf("猴王是:%d",p->data);
return OK;
}
void main()
{
int qua;
printf("输入猴群的数量:\n");
scanf("%d",&qua);
CNode *monkey;
monkey=NULL;
monkey=Creat_clist(monkey,qua); //建立猴群的循环链表
Kingmonkey(monkey);
}