数据结构课程设计——猴子选大王问题,我有程序,帮我解释下

2024-12-29 17:16:38
推荐回答(5个)
回答1:

#include
#include
#define n 19
#define m 4

typedef struct monkey
{
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;//p指向了第一个结点

printf("对猴子进行编号!\n");
for(i=1;i<=n;i++)
{
p->num=i;//从第一个结点到最后一个结点依次给猴子编号
printf("%d号猴子:%d\n",p->num,p->num);
p=p->next;
}//循环结束,p指向了最后一个结点

i=0;
p=head;//再把p指向第一个结点

while(1)
{
i++;
printf("%d号猴子报:%d\n",p->num,i);
if(p->next==p)
break;//此为while循环的出口

if(i==m)//if语句中是删除结点的过程
{
i=0;
printf("%d号猴被淘汰\n",p->num);
printf("\n");
p2->next=p->next;//在此删除结点p
p=p2->next;//p指向它的下一个结点
continue;
}
else
{
if(i==m-1)
p2=p;//保存将要退出结点的前一个结点(存到p2中)
p=p->next;
}
}

printf("胜出:%d",p->num);//最后剩下的结点就是获胜的结点

}

这个程序其实就是形成了一个有19个结点的循环链表,当碰到m的时候,用这两句话p2->next=head;p=head删除当前的结点,然后再继续判断。
还有不明白的地方可以问我!

回答2:

#include
#include
#define n 19
#define m 4
typedef struct monkey
{
int num;
struct monkey *next;
} Monkey,*LINK;
// Monkey 是猴子的结构体类型,包含一个号码和指向另一个猴子的指针,LINK是这种指针的类型。
void main()
{
LINK p,head,p2;
int i;
head=p=p2=(LINK)malloc(sizeof(Monkey));
// sizeof(Monkey) 指出 Monkey 结构的大小,malloc 函数分配这个数量的存储,用于形成一个 Monkey。head 按约定是表示“链表”的头指针,从此,head 就指向某个“Monkey链表”的第一个Monkey。现在,p 和 p2 也指向它
for(i=1;i{
p=(LINK)malloc(sizeof(Monkey));
p2->next=p;
p2=p;
}
// 这个循环分配了 n-1 个Monkey,并把它们用每个Monkey中的next指针串起来,这就形成了一个链表
p2->next=head;
// 链表的最后一个Monkey的next再指回第一个Monkey,形成了“循环链表”
p=head;
printf("对猴子进行编号!\n");
// 下面这个循环把整个链表中的n 个 Monkey 分别标记一个序号
for(i=1;i<=n;i++)
{
p->num=i;
printf("%d号猴子:%d\n",p->num,p->num);
p=p->next;
}
i=0;
p=head;

// 下面进入无限循环,但其中有跳出条件
while(1)
{
i++;
printf("%d号猴子报:%d\n",p->num,i);

if(p->next==p) break;
// 上面这句判断p的next指向自己,这说明循环链表只剩一个 Monkey,它就是猴王

if(i==m) // 如果数了 m 个数
{
i=0; // 重新数数
printf("%d号猴被淘汰\n",p->num);
printf("\n");
p2->next=p->next;
p=p2->next;
// 上面把这个 Monkey 从链表中摘了出来
continue;
}
else // 如果没数到 m 个,就再数链表的下一个
{
if(i==m-1) p2=p;
p=p->next;
}
}

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

}

回答3:

程序:#include
#include
#define n 19 //宏定义,设定19个猴子
#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);

}
帮我解释下各个语句的意思,简单说明下流程。最先给出圆满答案的还会追加分的。
问题补充:很急啊,高手们,拜托了!
可以帮我写出流程图或框图就更好了!

回答4:

这个程序运行是 赋予N=19,M=4,所以最后胜出的是9号猴子.

回答5:

忘记了