猴子选大王 实训(2)

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;

}




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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值