小孩围圈报数问题

来源:百度知道 编辑:UC知道 时间:2024/06/12 00:26:22
要求:现有小孩若干,他们围坐成一个圈,然后从第一个小孩开始依次报数,当报数到m的时候,这个小孩从圈中出来,剩余的小孩继续组成一个新圈,旁边的小孩再继续开始报数,直到出净为止。编一个程序,输出小孩的出圈次序。用C++编写,望高手能给以详细解说。解决以后高分追加。
我说的是用C++编写,你这个是用C编写的了,不用太抽象了,简单一点就行

#include<conio.h>
#include<stdio.h>

#include <stdlib.h>
#define n 20 //定义小孩数量,暂定为20
#define m 5 //报数

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<n;i++)
{
p=(LINK)malloc(sizeof(Monkey));
p2->next=p;
p2=p;
}

p2->next=head;//把链表的首尾相连
p=head;//p指向了第一个结点

for(i=1;i<=n;i++)
{
p->num=i;//从第一个结点到最后一个结点依次给小孩编号
p=p->next;
}//循环结束,p指向了最后一个结点

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

while(1)
{
i++;
if(p->next==p)
break;//此为while循环的出口

if(i==m)//if语句中是删除结点的过程
{
i=0;
printf("%3d号小孩被淘汰\n",p->num);
p2