数据结构——约瑟夫环问题(循环链表题解)

数据结构——约瑟夫环问题(循环链表题解)

//约瑟夫环问题(不考虑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;
	}    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值