约瑟夫环单链表解决(详细注释)

#include<iostream>
using namespace std;
typedef struct Node
{
	char data;
	struct Node *next;
}Node,*LinkList;
int main()
{
	char ch;
	cin>>ch;
	LinkList L;//定义一个链表
	L=(Node*)malloc(sizeof(Node));//申请结点空间
	L->data=ch;//L是第一个节点
	//如果定义L-〉next=NULL则表示有头结点,头结点的指针域为L,L-〉next表示的下一个即第一个结点
	Node *r;//尾指针
	r=L;
	Node *s;
	int n=0;//记录总人数
	while(true)
	{
		cin>>ch;
		if(ch=='@')
		{
			break;
		}
		s=(Node*)malloc(sizeof(Node));//申请新结点
		s->data=ch;
		r->next=s;//尾插法
		r=s;
		n++;
	}
	r->next=L;//指向第一个结点,建立循环
	Node *p;
	p=L;//p指向下一个节点
	int k=0;//记录退出的人数
	int x;       
	int y;//报到第几个开始自杀
	cout<<"输入从第几个人开始报数:";
	cin>>x;
	cout<<"输入报到多少开始自杀:"<<endl;
	cin>>y;//
	for(int i=1;i<x;i++)
	{
		p=p->next;//找到从谁开始了
	}
	cout<<"自杀顺序为:"<<endl;
	while(k<=n)
	{
		for(int j=1;j<y-1;j++)//找到要报数的前一个
		{
			p=p->next;
		}			
		cout<<p->next->data<<"  ";//输出报到那个数的人
		p->next=p->next->next;//自杀,删除这个人
		p=p->next;//指针继续下移一个,从下一个开始重新报数
		k++;//删除人数加1
	}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值