/*用个循环链表解决一个约瑟夫环问题*/
#include<stdio.h>
#include<malloc.h>
typedef struct huan
{
int num;
struct huan *next;
}Lhuan;
Lhuan *creat(int n) //建立循环链表
{
int i=1;
Lhuan *p1,*head;
head=p1=(Lhuan *)malloc(sizeof(Lhuan));
head->num=p1->num=i;
for(i=2;i<=n;i++)
{
p1->next=(Lhuan *)malloc(sizeof(Lhuan));
p1=p1->next;
p1->num=i;
}
p1->next=head;
return(head);
}
void baoshu(int n,int m,Lhuan *head) //报数
{
Lhuan *p1,*p2,*p3;
int i=2,j=1; //j是计数器
p2=head;
p1=head->next;
while(j!=n+1)
{
if(i==m)
{
p3=p1;
p1=p1->next;
p2->next=p3->next;
i=0;
j++;
printf("%d ",p3->num);
free(p3);
}
else
{
p1=p1->next;
p2=p2->next;
}
i++;
}
}
void main()
{
Lhuan *head;
int m,n;
printf("请输入参加报数的人数N和退出的号数M:/n");
printf("N=");
scanf("%d",&n);
printf("/nM=");
scanf("%d",&m);
head=creat(n);
printf("/n退出的依次是:");
baoshu(n,m,head);
printf("/n");
}