数据结构——约瑟夫环问题(循环链表题解)
//约瑟夫环问题(不考虑y>x)
//题设:输入 两个整数x,y,第一个整数代表共有x个人,第二个数代表挨个报数报y次;
// 输出 最后一个人的序号
#include<stdio.h>
#include<stdlib.h>
int Count=0;
typedef struct number
{
int number;
struct number *next;
}Number;
Number *Creat(int x) //创建循环链表
{
Number *head=NULL;
Number *New,*Old;
for(int i=1;i<=x;i++)
{
New=(Number *)malloc(sizeof(Number));
if(i>1)
Old->next=New;
New->number=i;
New->next=NULL;
Old=New;
if(i==1)
head=New;
}
Old->next=head; //尾指针指向头指针
return head;
}
Number *Delete(Number *head,int y,int x) //单个删除结点
{
if(y==1)
y=x+1-Count;
Count++;
Number *start=head,*mid,*end;
for(int i=1;i<y-1;i++)
start=start->next;
end=(start->next)->next;
mid=start->next;
start->next=end;
printf("%d ",mid->number);
free(mid);
return end;
}
int main()
{
int x,y;
Number *link;
scanf("%d%d",&x,&y);
if(y>x)
{
printf("error!!!\n");
return 0;
}
link=Creat(x);
printf("死亡顺序: "); //创建一个长为x的循环链表
for(int i=1;i<x;i++) //循环到只剩一个序号停止
link=Delete(link,y,x); //删除第y个结点
printf("%d",link->number); //输出结点对应值
free(link); //释放最后结点
return 0;
}