猴子选大王,C语言描述 请相信解释我的代码!

猴子选大王问题描述:一堆猴子都有编号,编号是1,2,3….m,这群猴子(m个)按照1-m的顺序围坐一圈,从1开始数,每数到第N个,该猴子就要离开此圈,这样依次下来,直到圈... 猴子选大王问题描述:一堆猴子都有编号,编号是1,2,3….m,这群猴子(m个)按照1-m的顺序围坐一圈,从1开始数,每数到第N个,该猴子就要离开此圈,这样依次下来,直到圈中只剩下最后一只猴子,则该猴子为大王。
输入数据:输入m,n。 (m,n为整数,且n<m)
输出形式:按照出列顺序输出个人的编号。
#include <stdio.h>
#include<malloc.h>
typedef struct LNode
{
int num;
struct LNode *next;
}LNode, *LinkList;
LinkList InitList(LinkList L,int n)
{
LinkList p,q;
int i;
L = (LinkList)malloc(sizeof(LNode));
L->num = 1;
q=L;
for(i = 2; i <= n; i++)
{
p = (LinkList)malloc(sizeof(LNode));
p->num = i;
q->next=p;
q=p;
}
q->next = L;
return L;
}
void ListDelete_L(LinkList L,int n)
{
LinkList p,q;
p=L;
int j=1;
while(p->next!=p)
{
while(j!=n-1)
{
p=p->next;
j++;
}
q=p->next;
p->next=p->next->next;
printf("%d",q->num);
free(q);
j=0;
}
printf("%d",p->num);
free(p);
}
int main()
{
LinkList L=NULL;
int n,m,e=0;
printf("请输入猴子个数:");
scanf("%d",&m);
printf("请输入n值:");
scanf("%d",&n);
if(m<=n){printf("m应该 大于n请重新输入");return 0 ;
}
L=InitList(L,m);
printf("出列的顺序为:");
ListDelete_L( L,n);
return 0;
}
展开
 我来答
lvguohongwin
2011-01-09 · TA获得超过1822个赞
知道小有建树答主
回答量:416
采纳率:100%
帮助的人:555万
展开全部
给你原文做了注释。还不懂hi我
#include <stdio.h>
#include<malloc.h>
typedef struct LNode
{
int num;
struct LNode *next;
}LNode, *LinkList; //定义结点
LinkList InitList(LinkList L,int n) //初始化循环链表
{
LinkList p,q;
int i;
L = (LinkList)malloc(sizeof(LNode)); //头结点
L->num = 1; //一号猴子
q=L;
for(i = 2; i <= n; i++) //从二号猴子开始生成结点
{
p = (LinkList)malloc(sizeof(LNode));
p->num = i;
q->next=p;
q=p;
}
q->next = L; //使链表循环起来
return L;
}
void ListDelete_L(LinkList L,int n)
{
LinkList p,q;
int j=1; //j为计数器
p=L;

while(p->next!=p) //p->next=p时是只剩一个结点。
{
while(j!=n-1) //当j=n-1时应该将该结点的下一个结点删除。当就j!=n-1时就应该指针向后移,同时计数器加一
{
p=p->next;
j++;
}
q=p->next; //q即为被点到的猴子
p->next=p->next->next; //删除q结点
printf("%d\n",q->num);
free(q);//释放
j=0; //计数器清零,重新开始计数
}
printf("%d",p->num);//此时的结点就是大王
free(p);
}
int main()
{
LinkList L=NULL;
int n,m,e=0;
printf("请输入猴子个数:");
scanf("%d",&m);
printf("请输入n值:");
scanf("%d",&n);
if(m<n){printf("m应该 大于n请重新输入");return 0 ;
}
L=InitList(L,m);
printf("出列的顺序为:");
ListDelete_L( L,n);
return 0;
}
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式