求助:约瑟夫环问题--用链表写的
约瑟夫环问题:N个人围坐一圈,1,2,3一次报数,数到3的出列,只到剩下一个人,并给出最后一个人的座号我写的程序如下:
#include<stdio.h>
#include<stdlib.h>
struct number
{
int n;
struct number *p_num;
}*head=NULL;
main()
{
int i,j=1,count=2; //count控制报数
struct number *p_temp,*p_last,*p_del; //建立表头结构指针p_temp和表尾结构指针p_last
printf("请输入报数筛选的总人数:\n");
scanf("%d",&i);
p_temp=(struct number *)malloc(sizeof(struct number)); //申请第1级链表节点空间
p_temp->n=j;
head=p_last=p_temp;
for(j=2;j<=i;j++) //建立第2级以后链表,并从2开始给n赋值
{
p_temp=(struct number *)malloc(sizeof(struct number)); //申请第j级链表节点空间
p_temp->n=j; //第n个节点赋值j,其中n=j
p_last->p_num=p_temp;
p_last=p_temp;
}
p_temp=head; //让指针指向链表的表头,为输出做准备
printf("共有%d人参与本次报数筛选,他们的编号如下:\n",i); //返回用户输入值
for(j=1;j<=i;j++)
{
printf("%d ",p_temp->n);
p_temp=p_temp->p_num;
}
putchar(10);
p_last->p_num=p_temp=head; //第n个节点的尾,接第一个尾,接第一个节点的头,形成链表环
while(end of loop) //开始报数----退出循环语句不会,这里迷糊了
{
p_temp=p_temp->p_num;
if(count%3==0) //逢3的倍数删节点
{
p_del=p_temp->p_num; //p_del指向要删除的节点
p_temp->p_num=p_del->p_num; //隔离要删除的节点
free(p_del); //释放p_del指针所指向的内存空间,即删除节点
}
count++;
}
printf("\n最后留下的是第%d位同学!\n",p_temp->n);
}
请高手看看我的程序,尤其是报数删除节点部分的循环控制语句怎么写?鸣谢!