2、猴子选大王
一群猴子都有编号,编号是1、2、3、…、m,这群猴子(m个)按照1~m的顺序围坐一圈,从1开始,每数到第n个,该猴子就要离开此圈,这样依次下去直到圈中只剩下最后一只猴子,则该猴子为大王。
【基本功能要求】
(1)输入数据:输入整数m、n,其中n<m;
(2)提示按照m个猴子数n个数的方法,输出猴子大王是几号。
提示:使用“循环链表”实现。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct monkey
{
intdata; //猴子数;
structmonkey *next;
}List, *pList;
void monkey_list(pList ls) //建立一个有m只猴子的链表;
{
intm;
printf("请输入有多少猴子:");
scanf("%d",&m);
ls->data = m; //头结点的数据域用于保存猴子数;
if(m > 0)
{
pListfront; //用于创建新的结点;
pListlast; //指向最后一个结点;
front= (pList)malloc(sizeof(List)); //把ls指向链表;
ls->next= front;
last= front; //last指向最后一个结点;
inti;
for(i=1; i<=m; ++i)
{
front->data= i; //数据域赋值;
front->next= NULL;
last->next= front; //front连接进链表;
last= front; //last指向最后一个结点;
front= NULL; //分配空间前,消除可能存在的隐患;
front= (pList)malloc(sizeof(List));
}
last->next= ls->next; //形成循环链表;
}
}
void del_monkey(pList ls) //找出猴子王;
{
if(NULL == ls->next)
{
printf("猴子死光了\n");
return;
}
intn;
printf("请输入猴子所在位置:");
scanf("%d",&n);
intm;
m= ls->data;
if(m>n && n>0)
{
inti; //用于计数;
i= 0;
pListfront; //保存删除掉结点的前一个结点;
pListfront_1; //n为1时,循环链表的最后一个结点;
while(1 != m)
{
++i;
front= ls;
ls= ls->next;
if(i == n)
{
if(1 == n) //n为1时,须找到最后一个结点,形成循环;可以直接输出最后一个结点,这种想的事还是留给电脑....
{
front_1= ls;
while(ls != front_1->next) //找到最后一个结点;
{
front_1= front_1->next;
}
front_1->next = ls->next; //连成循环;
front->next= ls->next;
free(ls);
ls= front; //ls指向删除的前一结点,因为i赋为0;
}
else
{
front->next= ls->next; //跟上面三句一样,可以不用else;
free(ls);
ls= front;
}
i= 0; //
--m;
}
}
printf("猴子王的编号是:%d\n", ls->data);
}
elseif (1==m)
{
printf("猴子王的编号是:%d\n", ls->next->data);
}
else
{
printf("你的输入有错!\n");
}
}
int main(void)
{
pListls;
ls= (pList)malloc(sizeof(List));
ls->next= NULL; //用于判断猴子数是否为空;
monkey_list(ls); //建立一个有m只猴子的链表;
del_monkey(ls); //删除猴子,找出猴子王;
return0;
}