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

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

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

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

具体代码如下:

#include <iostream>
#include <stdlib.h>
#include <time.h>
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;i<n;i++)//给所有玩家随机提供号码牌并用尾插法连接 
	{
		p=new list;
		p->a=(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;i<n-t;i++)
	{
		for(j=0;j<q->a;)
		{
			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<<m<<" ";//输出幸存者的位置 
		}
		head=head->next;
		m++;//计数器往后递增 
	}
}

  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值