猴子选大王c语言循环链表实现,PTA 6-15 用单向循环链表实现猴子选大王 (20 分)...

一群猴子要选新猴王。新猴王的选择方法是:让n只候选猴子围成一圈,从某位置起顺序编号为1~n号。每只猴子预先设定一个数(或称定数),用最后一只猴子的定数d,从第一只猴子开始报数,报到d的猴子即退出圈子;当某只猴子退出时,就用它的定数决定它后面的第几只猴子将在下次退出。如此不断循环,最后剩下的一只猴子就选为猴王。请输出猴子退出圈子的次序以及当选的猴王编号。

函数接口定义:

int KingOfMonkey(int n,linklist *head);

裁判测试程序样例:

#include

#include

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)

{

linklist *head = NULL, *tail = NULL, *p;

for (int i = 1; i <= n; i++)

{

p = (linklist *)malloc(sizeof(linklist));

scanf("%d", &p->mydata);

p->number = i;

if (i == 1)

{

head = p;

head->next = NULL;

tail = head;

}

else

{

tail->next = p;

tail = tail->next;

tail->next = head;

}

}

return tail;

}

int KingOfMonkey(int n, linklist *head)

{

int cnt = head->mydata - 1;

while (head->number != head->next->number)

{

if (!cnt)

{

printf("Delete No:%d\n", head->next->number);

cnt = head->next->mydata - 1;

head->next = head->next->next;

}

else

{

cnt--;

head = head->next;

}

}

return head->number;

}

POJ3750&colon; 小孩报数问题&plus;一道经典约瑟夫问题(猴子选大王)

又一次因为一个小错误,POJ上Wrong Answer了无数次..... 在差不多要放弃的时候,发现了这个猥琐的不能再猥琐的bug,改完了提交就AC了,简直无语.... 本题wo采用模拟方法: 1 # ...

猴子选大王的c&num;实现

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值