链表-PTA-猴子选大王

一群猴子要选新猴王。新猴王的选择方法是:让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;
	
}

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值