猴子选大王 C语言 双向链表实现

本文介绍了一种通过双向链表实现的猴子选大王算法。该算法模拟了M只猴子围成一圈,并按特定规则选出猴王的过程。具体而言,从第一个猴子开始,每隔N个猴子,数到的猴子将出局,直至最后剩下的一只即为大王。文章提供了完整的C语言代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 有M个猴子围成一圈,每个有一个编号,编号从1到M。打算从中选出一个大王。经过协商,决定选大王的规则如下:从第一个开始,每隔N个,数到的猴子出圈,最后剩下来的就是大王。

要求:从键盘输入M,N,编程计算哪一个编号的猴子成为大王。

实现如下:

 

#include <stdio.h>
#include <stdlib.h>

#define LEN sizeof(struct monkey)
struct monkey
{
 int num;
 struct monkey *next;
 struct monkey *prior;
};

void selcetKing(int m, int n)
{
 //建立带头结点的链表
 struct monkey *h, *p, *p1;
 
 p1=(struct monkey *)malloc(LEN);
 if(p1==NULL)
  printf("No enough memory!");
 
 p1->num=0;
 p1->next=NULL;
 p1->prior=NULL;
 
 h=p1;
 p=p1;
 
 for (int i=0; i<m; i++)
 {
  p1=(struct monkey *)malloc(LEN);
  if(p1==NULL)
   printf("No enough memory!");
  
  p1->num=i+1;
  p1->next=NULL;
  p1->prior=p;
  
  p->next=p1;
  p=p1;
 }

 h->num=m; //头结点的数据域存放猴子的个数
 p->next=h->next;
 h->next->prior=p;
 
 //遍历链表
 // printf("%d",h->num);
 // struct monkey *q=h->next;
 // for(int j=0; j<h->num; j++)//正向验证
 // {
 //  printf("%d/n",q->num);
 //  q=q->next;
 // }
 
 // for(int r=0; r<h->num; r++) //反向验证
 // {
 //  printf("%d/n",q->num);
 //  q=q->prior;
 // }
 
 struct monkey *q, *r, *s;
 q=r=s=h->next;
 while (h->num>1)
 {
  int j;
  for (j=1; j<n; j++)
  {
   q=q->next;
   r=r->next;
   s=s->next;
  }
  if (j==n)
  {
   q=q->prior;
   r=r->next;
   free(s);
   h->num--;
   
   if (h->num==1)
   {
    r->next=NULL;
    r->prior=NULL;
    q=r;
    s=r;
   }
   else
   {
    q->next=r;
    r->prior=q;
    s=r;
    q=r;
   }
  }
 }
 printf("%d/n",r->num);
}

void main()
{
 int m,n;
 printf("请输入猴子数目及所报数目:");
 
 scanf("%d%d", &m, &n);
 
 if(m>0&&n>0)
  selcetKing(m,n);
 else
  printf("请输入正整数!/n");
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值