约瑟夫法环升级版(循环链表)

这篇文章的内容还是约瑟夫法环,较我上一篇约瑟夫法环有一定的提升(当然没看过我上一篇约瑟夫法环的友友们可以去看一下)

提升就是上次是每数过一定数目的人淘汰,而这次的升级主要是每个人手里都会有一个号码牌,咱们先看第一个人的号码牌,然后从第一个人开始数,比如第一个人手里的号码牌为4,那么第一个淘汰的人就是第4个人,然后我们再看第4个人手里的号码牌,由这个号码牌来决定下一个淘汰的人的位置,比如他手里的号码牌如果是5,那么下一个淘汰的人就是第9个人。

可是如果我们参加游戏的人特别多,那我们要给每个人都输入手里的号码牌未免会有点繁琐,所以我也用了随机函数,由系统来为所有人随机分配手里的号码牌,如果友友们想知道它们的号码牌分别是多少,也可以把我的代码复制走往中间加一个链表的遍历就可以了。

具体代码如下:

#include 
#include 
#include 
using namespace std;
typedef struct list{
	int a;
	struct list *next;
}list,*yue;//节点的结构体 
int main()
{
	yue head,p,r,q;//四个结构体型指针 
	int i,n,j,t,m,w;
	srand((unsigned)time(NULL));
	cout<<"请输入玩这个死亡游戏的总人数:"; 
	cin>>n;//游戏总人数 
	head=new list;//创建头节点 
	head->next=NULL;
	r=head;
	for(i=0;ia=(rand()%10)+1;//随机赋值 
		p->next=NULL;
		r->next=p;
		r=p;
	}
	cout<<"请输入最后剩余的幸存者个数:";
	cin>>t;
	r->next=head->next;//连接循环链表
	head->a=head->next->a; 
	p=head;//p从head开始进入循环
	q=p;//记录每个死掉的人手里的号码牌(用头节点中的数记录) 
	for(i=0;ia;)
		{
			p=p->next;
			if(p->a==0)//如果这之间路过了已经死掉的人,则跳过 
			{
				continue;
			}
			else
			{
				if(j==(q->a)-1)//到了死亡的序号 
				{
					w=p->a;//w是个中间变量,此时不能直接用q->a直接赋值,否则会影响内层的for循环 
					p->a=0;//那个人死掉,将那个人置为0 
				}
				j++;
			}
		}
		q->a=w;
	}
	head=head->next;//head指针遍历链表(寻找幸存者) 
	r->next=NULL;//循环链表断开,否则会进入死循环 
	cout<<"最后的幸存者的编号为:";
	m=1;//计数器,记录最后存活的人的位置 
	while(head!=NULL)//遍历链表操作(寻找幸存者) 
	{
		if(head->a!=0)
		{
			cout<next;
		m++;//计数器往后递增 
	}
}

你可能感兴趣的:(C/C++数据结构与算法,链表,c++,数据结构,算法)