猴子选大王c语言单链表,n只猴子要选大王,选举方法如下:所有猴子按 1,2 ……… n 编号并按照顺序围成一圈,从第 k 个猴子起,...

满意答案

02ae427d08e371d7e90d5b995e828d6d.png

ogmwecdcq

推荐于 2017.09.05

02ae427d08e371d7e90d5b995e828d6d.png

采纳率:57%    等级:12

已帮助:8161人

亏我还能找到原题。。。嘛,幸好这题也是比较出名的链表经典了。随手整理了一下网上的解答,顺便自己温习了一下。

原题(完整叙述):

M只猴子要选大王,选举办法如下:所有猴子按1,2……n编号围成一圈,从第一号开始顺序1,2……m,凡是报m号的退出圈外,如此循环报数直到圈内只剩一只猴子时这只猴子就是大王。

C++解答

#include

using namespace std;

struct monkey //结构声明

{

int num; //整型数,用于记录猴子号

monkey *next; //monkey结构指针

};

monkey *head,*tail; //monkey结构指针,全局变量

void creat(int nn) //被调用函数

{ //函数体开始

int i; //整型变量i,用于计数

monkey *p,*q; //声明monkey结构指针p,q

p=new monkey; //为p分配内存空间

p->num=1; //初始化p结点num域为1

p->next=NULL; //初始化p结点next域为空

head=p; //链表头指针head赋值为p

q=p; //q赋值为p

for(i=2;i<=nn;i=i+1) //利用循环结构构造链表

{

p=new monkey; //为p配内存空间

p->num=i; //初始化p结点num域为i,表示猴子号

q->next=p; //将p点加到链表尾部

q=p; //让指向链表尾部结点

p->next=NULL; //链表尾部指向空

}

tail=q; //链表尾

tail->next=head; //链表尾部指向链表头,形成循环链表

}

//被调用函数select,mm表示结点删除间隔

void select(int mm)

{ //函数体开始

int x=0; //声明整型值x,并初始化为0

monkey *p,*q; //声明指针变量p,q

q=tail; //q赋值给tail,指向循环链表尾部

do //直到型循环,用于循环删除指定间隔的结点

{

p=q->next; //p赋值给相邻的下一个结点

x=x+1; //x加1

if(x%mm==0) //x是否整除mm

{

cout<num<

q->next=p->next; //删除此结点

delete p; //释放空间

p=NULL;

}

else

q=p; //q指向相邻的下一个结点p

}while(q!=q->next); //剩余结点数不为1,则继续循环

head=q; //head指向结点q,q为链表中剩余的一个结点

} //函数体结束

int main() //函数体开始

{

int n,m; //声明整型变量n,m

head=NULL; //初始化head为空

cout<

cin>>n; //输入待插入结点的数据

cout<

cin>>m; //输入间隔

creat(n); //调用函数creat建立循环链表

select(m); //调用函数select,找出剩下的猴子

cout<num<

delete head; //删除循环中最后一个结点

return 0;

} //函数体结束

==========================================

C语言

#include

#include

#define n 5 //宏定义,设定猴子个数

#define m 4 //报数最大报到4

typedef struct monkey //设计一个猴子的结构体,该结构体用monkey表示//link表示该结构体的指针

{

int num; //它的号码

struct monkey *next; //下个猴子的地址指针

} Monkey,*LINK;

void main()

{

LINK p,head,p2; //定义了三个猴子结构的指针

int i;

head=p=p2=(LINK)malloc(sizeof(Monkey));//开辟空间用来存储猴子结构

for(i=1;i

{

p=(LINK)malloc(sizeof(Monkey)); //开辟新空间用来存各个猴子结构

p2->next=p;

p2=p;

}

p2->next=head;//这步很重要,这样链表变成循环链表了,也就是说链表到了结

//尾它的下个地址就是链表头了如此不停循环下去,就是个圆

p=head;

printf("对猴子进行编号!\n");

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

{

p->num=i; //对猴子编号

printf("%d号猴子:%d\n",p->num,p->num);

p=p->next; //指针指向下个猴子

} //所有猴子编号结束

i=0;

p=head; //又将p指向了链表的头

while(1)

{

i++;

printf("%d号猴子报:%d\n",p->num,i);

if(p->next==p)//这是结束条件,你想自己的下一个就是自己本身了,是不是说

//明只剩下自己了,也就是大王了

break;

if(i==m) //如果这一个报到了数m

{

i=0; //再次从1开始报数,因为以后要执行i++语句

printf("%d号猴被淘汰\n",p->num); //这个号码的猴子要被淘汰

printf("\n");

p2->next=p->next;//将该猴子从链表中拿下

p=p2->next;//指针指向下一个猴子

continue; //该语句可以舍去,没有啥用

}

else //没有报到m的继续报数

{

if(i==m-1)

p2 = p;

p = p->next;

}

}

printf("胜出:%d",p->num);

}

==========================================

Pascal语言

var a,b,c,d,n,m:integer; admin:array[1..50] of integer;

begin

b:=0;

read(n,m);

for a:=1 to n do admin[a]:=a;

b:=m;

for a:=1 to n-1 do

begin

admin[b]:=0;

while c

b:=b+1;

if b>n then b:=b mod n;

if admin[b]>0 then c:=c+1;

end;

c:=0;

end;

for a:=1 to n do if admin[a]>0 then write(a);

end.

50分享举报

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值