一群猴子要选新猴王。新猴王的选择方法是:让n只候选猴子围成一圈,从某位置起顺序编号为1~n号。每只猴子预先设定一个数(或称定数),用最后一只猴子的定数d,从第一只猴子开始报数,报到d的猴子即退出圈子;当某只猴子退出时,就用它的定数决定它后面的第几只猴子将在下次退出。如此不断循环,最后剩下的一只猴子就选为猴王。请输出猴子退出圈子的次序以及当选的猴王编号。
函数接口定义:
int KingOfMonkey(int n,linklist *head);
裁判测试程序样例:
#include <stdio.h>
#include <stdlib.h>
typedef struct node /*这个结构类型包括三个域 */
{ int number; /*猴子的编号*/
int mydata; /* 猴子的定数 */
struct node *next; /* 指向下一只猴子的指针 */
} linklist;
linklist *CreateCircle( int n );
linklist *DeleteNext(linklist *p); /* 删除单循环链表的p所指的下一个结点 */
/* 提示: 你所有的代码将由系统插入在此处 */
int main()
{
linklist *head;
int i,n;
scanf("%d",&n);
head = CreateCircle(n); /*创建单向循环链表 */
printf("The king is monkey[%d].\n", KingOfMonkey(n,head));
return 0;
}
输入样例:
在这里给出一组输入。例如:
5
3 2 1 4 3
输出样例:
在这里给出相应的输出。例如:
Delete No:3
Delete No:4
Delete No:5
Delete No:1
The king is monkey[2].
我的答案
linklist *CreateCircle( int n )
{
int i=1;
linklist* head, *p, *q;
if(n==0){return NULL;}
p = (linklist*)malloc(sizeof(linklist));
scanf("%d",&p->mydata);
p->number = 1;
head=q=p;
for(i=2; i<=n; i++)
{
p = (linklist*)malloc(sizeof(linklist));
scanf("%d",&p->mydata);
p->number = i;
q->next=p; q=p;
}
p->next = head;
// for ( p = head; ; p = p->next )
// printf("%d %d\n", p->number, p->mydata);
return head;
}
linklist *DeleteNext(linklist *p)
{
linklist* q;
q=p;
printf("Delete No:%d\n",(q->next)->number);
p=p->next; p=p->next;
q->next=p;
return q;
}
int KingOfMonkey(int n, linklist *head)
{
linklist* tail, *p, *q;
int i,t,count=n;
tail=head;
for(i=2; i<=n; i++)
{tail = tail->next;}
p=tail;
t=tail->mydata;
while(1)
{
for(i=1; i<=t-1; i++)
{p=p->next;}
q=p->next; DeleteNext(p); count--;
if(count==1) break;
t=q->mydata;
}
return p->number;
}