循环单链表解决约瑟夫环_用链表解决约瑟夫环问题

循环单链表解决约瑟夫环_用链表解决约瑟夫环问题已知有5个人围坐在一张圆桌的周围,从编号为3的人开始顺时针数数,数到2的那个人出列淘汰,然后从出列的下个一人继续数,依次循环,直到只剩下最后一个人。(使用循环链表实现约瑟夫环)代码如下:#include “pch.h”#include<string>#include<fstream>#include<Windows.h>#include <i…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

已知有5个人围坐在一张圆桌的周围,从编号为3的人开始顺时针数数,数到2的那个人出列淘汰,然后从出列的下个一人继续数,依次循环,直到只剩下最后一个人。(使用循环链表实现约瑟夫环)

在这里插入图片描述
代码如下:

#include "pch.h"
#include<string>
#include<fstream>
#include<Windows.h>
#include <iostream>

using namespace std;

//循环链表基本实现

//typedef struct LNode
//{ 
   
// int date;
// LNode* next;
//}*LinkList;
//
新建单链表
//void InitList(LinkList &L)
//{ 
   
// L = new LNode;
// L->next = NULL;
//}
//
给链表增加节点
//void GetLinkList(LinkList &L, int n)
//{ 
   
// LNode *p;
// LNode *r;
// r = L;
// char filename[20] = { 0 };
//
// cout << "请输入单向有序链表"
// <<"数据文件名字(文件名+“.txt”),例如List.txt"
// << ".txt" << endl;
//
// gets_s(filename);
// fstream file;
// file.open(filename);
// if (!file)
// { 
   
// cout << "文件数据打开失败!" << endl;
// Sleep(5000);
// exit(0);
// }
// 
// while (!file.eof())
// { 
   
// p = new LNode;
// file >> p->date;
// p->next = NULL; //前插插
// r->next = p;
// r = p;
// n++;
//
// }
//
// file.close();
//}
//
//void OutPutList(LinkList L)
//{ 
   
// LNode *p;
// p = L->next;
// while (p)
// { 
   
// cout << p->date << " ";
// p = p->next;
// }
//}
//
链表合并函数
//void MergeLinkList(LinkList &la, LinkList &lb, LinkList &lc)
//{ 
   
// LinkList pa, pb, pc;
// pa = la->next;
// pb = lb->next;
// 
// lc = la;
// pc = lc;
// 
// //两段链表都有节点
// while (pa&&pb)
// { 
   
// if (pa->date<=pb->date)
// { 
   
// pc->next = pa;
// pc = pa;
// pa = pa->next;
// }
// else
// { 
   
// pc->next = pb;
// pc = pb; 
// pb=pb->next;
// }
//
// pc->next = pa ? pa : pb;
//
// }
//}
//
//int main()
//{ 
   
// LinkList la,lb, lc;
//
// InitList(la);
// GetLinkList(la, 1);
// OutPutList(la);
// cout << endl;
//
// InitList(lb);
// GetLinkList(lb, 1);
// OutPutList(lb);
// cout << endl;
//
// InitList(lc);
// MergeLinkList(la, lb, lc);
// OutPutList(lc);
//
// return 0;
//}
//


//约瑟夫环实现
typedef struct Person
{ 
   
	int numberdate;
	Person *next;
}*LinkPerson;

LinkPerson initList(int n)
{ 
   
	LinkPerson L = new Person;
	L->numberdate = 1;
	L->next = NULL;
	Person*p = L;

	for (int i = 2; i <= n; i++)
	{ 
   
		Person*body = new Person;
		body->numberdate = i;
		body->next = NULL;
		p->next = body;
		p = p->next;
	}
	p->next = L;		//首尾相接
	return L;
}

void KillPerson(LinkPerson L, int a, int b)
{ 
   	//a是编号,b是数几淘汰
	LinkPerson tail = L;
	while (tail->next != L)
	{ 
   
		tail = tail->next;
	}

	LinkPerson p = L;
	//把链表的开头给开始的那个人
	while (p->numberdate != a)
	{ 
   
		tail = p;
		p = p->next;
	}
	//当p->next=p时说明只剩下一个人,游戏结束
	while (p->next != p)
	{ 
   
		//重新写入剩下的游戏玩家
		for (int i = 1; i < b; i++)
		{ 
   
			tail = p;
			p = p->next;
		}
		//从链表上将p结点就删除了
		tail->next = p->next;
		cout << "被杀的人是" << p->numberdate << "号" << endl;
		delete p;
		p = tail->next;

	}
	cout << "最后胜出的是:" << p->numberdate << endl;
	delete p;
}

int main()
{ 
   
	int n, a, b;
	cout << "请输入玩家数:";
	cin >> n;
	cout << "请输入从几号玩家开始:";
	cin >> a;
	cout << "请输入每次步数:";
	cin >> b;

	Person *L= initList(n);
	KillPerson(L, a, b);
	return 0;
}


结果为:
在这里插入图片描述

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/170977.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 配置tomcat的环境变量

    配置tomcat的环境变量配置Tomcat的环境变量注意:配值tomcat之前要将JDK的JAVA_HOME和path都配置好,否则后续会出现Tomcat无法启动或者闪退等问题。1.首先下载tomcat,并且解压到目录:2.第二步鼠标右键计算机->属性->高级系统设置,进去之后,点击环境变量,如下图所示3.第三步开始配置tomcat的环境变量,新建系统变量名CATALINA_BASE,值为tomcat的安装路径,如下图所示:4.第四步新建系统变量CATALINA_HOME,值tomcat

    2022年6月3日
    26
  • 顺序表的定义_顺序表的逻辑顺序和物理顺序

    顺序表的定义_顺序表的逻辑顺序和物理顺序顺序表的定义线性表的顺序存储又称为顺序表来看一个生活中的例子:周末和朋友一起吃火锅,人非常多,我们需要在等候区等候,这个等候区就与顺序表有非常多的相似之处,借助它去理解顺序表的特点。首先,在等候

    2022年8月4日
    9
  • Android中Calendar类的用法总结[通俗易懂]

    Android中Calendar类的用法总结[通俗易懂]Calendar是Android开发中需要获取时间时必不可少的一个工具类,通过这个类可以获得的时间信息还是很丰富的,下面做一个总结,以后使用的时候就不用总是去翻书或者查资料了。

    2022年9月23日
    3
  • mysql的命名规则_Mysql命名规范

    mysql的命名规则_Mysql命名规范转自:https://blog.csdn.net/fujian9544/article/details/86649096数据库表字段命名规范内容由网上摘抄并进行总结/精简/标记后的内容本文包含了数据库命名数据库表命名数据库表字段命名SQL语言编码的规范一、数据库命名规范采用26个英文字母(区分大小写)和0-9的自然数(经常不需要)加上下划线’_’组成,命名简洁明确,多个单词用下划线’_’分隔,一个…

    2022年7月14日
    14
  • 电力电子技术 学习总结1

    第二章PPT91以前电力电子器件(PowerElectronicDevice)—可直接用于处理电能的主电路中,实现电能的变换或控制的电子器件。主电路(MainPowerCircuit)—电力电子设备或系统中,直接完成电能变换或控制的电路。广义上电力电子器件可分为电真空器件和半导体器件两类。自20世纪50年代以来,真空管(VacuumValve)仅在频率很高(如微波,数GHz)的大功率高频电源中还在使用,而在大多数电能变换领域,电力半导体器件已取代了汞弧整流器、闸流管等电真空器件

    2022年4月14日
    93
  • 网站的栏目页是什么_栏目页

    网站的栏目页是什么_栏目页功能说明栏目子分类列表,栏目导航适用范围首页模板,列表模板,内容模板基本语法[NT:unLoop,NT:SiteID=0,NT:LabelType=ClassNavi,NT:ClassID=ClassID,NT:HrefCSS=HrefCSS,NT:NaviChar=NaviChar,NT:isDiv=false,NT:Cols=1][/NT:unLoop…

    2022年9月28日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号