热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

约瑟夫环的循环单链表实现(数据结构)

原标题:约瑟夫环的循环单链表实现(数据结构)约瑟夫环(约瑟夫问题)是一个数学的应用问题:已知n个人(以编号1,2,3n分别表示)围坐在一张圆桌周围。.从编号为k的人

原标题:约瑟夫环的循环单链表实现(数据结构)

约瑟夫环(约瑟夫问题)是一个数学的应用问题:已知 n 个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。. 从编号为 k 的人开始报数,数到 m 的文章来源站点https://www.yii666.com/那个人出圈;他的下一个人又从 1 开始报数,数到 m 的那个人又出圈;依此规律重复下去,直到剩余最后一个胜利者。. 例如:有10个人围成一圈进行此游戏,每个人编号为 1-10 。. 若规定数到 3 的人出圈。. 则游戏过程如下。. (1)开始报数,第一个数到 3 的人为 3 号,3 号出圈。. 1, 2, 【 3 】, 4, 5, 6, 7, 8, 9, 10。. (2)从4号重新从1开始计数,则接下来数到3的人为6号,6号出圈。

废话不多说,直接上代码:

下面是头文件,命名为”约瑟夫环.h“

#ifndef Josephus_circle//判断是否被定义过Josephus_circle
#define Josephus_circle
struct Node//定义一个结构体,用来表示每一个结点
{
int data;//表示每一个结点的数字,也就是序号
Node* next;//定义一个结构体指针,用来指向后一个结点
};
class Josephus//定义一个类,里面包含有三个接口,和两个私有成员变量
{
public :
Josephus(int n);//定义一个构造函数,用来创建一个约瑟夫环
~Josephus();//析构函数,用以销毁一个约瑟夫环
void ResultShow(int m);//展示出圈顺序
private :
Node * rear,*first;//定义一个节点形指针,用来指向最后一个结点
};
#endif

下面是接口的具体实现,命名为“约瑟夫环.cpp”

#include//引入输入输出流
#include"约瑟夫环.h"//引入约瑟夫环头文件
using namespace std;
Josephus::Josephus(int n)
{
first=rear = new Node;//将头指针和尾指针指向第一个新建的结点,也就是初始化指针
rear->data = 1;//首先,将第一个结点数据域赋值为1
for (int i = 2; i <= n; i++) //从2开始
{
Node* s = new Node;//定义一个Node形指针s,指向新建的一个结点
rear->next = s;//将指向头结点的尾指针指向下一个结点,也就是s所指的结点
s->data = i;//将新建的结点数字域赋值为i
rear = s;//将尾结点移动到新建结点s
}
rear->next = first;//在循环过后,将尾结点和头节点连接起来,构成循环链表
}
Josephus::~Josephus()
{
if (first!=rear)//判断环是否为空
{
while (first != rear)//每次循环都是当头节点不等于尾结点时候,开始删除:……
{
Node * p = first;//定义一个新的节点形指针,指向头节点,用作暂存要删去的结点
first = first->next;//将头节点移动到下一个结点
delete p;//删除之前头节点所指向的结点
}
delete rear;//在删除完成后,文章来源地址53015.html剩下的最后就只有尾结点了,删除即可
}
else
{
cout <<"约瑟夫环为空,请先建立新环!" < }
}
void Josephus::ResultShow(int m)
{
cout <<"出环顺序为:" < Node * p = first;//定义一个Node类型的p,等于first
Node * pre=first,* reserve=nullptr;//定义pre等于fiwww.yii666.comrst,和一个代替p指针被删除的结点的指针
int count = 1;//定义一个计数的count使其为一
while (p->next != p)//如果p->next所指向的结点是p的话,表示,这已经是最后一个结点了,该节点为最后出圈
{
if (count {
pre = p;//将pre等于p,以便于表示p变换前的结点
p = p->next;//p向下一结点移动
count++;//移动一次count加一次
}
else//每次count=m时候就开始删除对应结点
{
pre->next = p->next;//首先从环中摘去要删除的p所指的结点
reserve = p;//使用reserve来保存被摘去的结点p
cout <data <<"\t";//输出结点p所数据域,输出在屏幕上表示p结点的出圈
p = p->next;//p指向下一结点,以便于下一轮的循环
delete reserve;//删除保存p的reserve所对应的结点
count = 1;//将计数恢复为1,以便下一轮www.yii666.com计数
}
}
cout <data < delete p;//输出最后再删除这一结点,释放内存
pre=first=rear=p = NULL;//避免野指针出现使其指向空
}

下面是main函数,命名为“约瑟夫环_main.cpp”

#include//引入输入输出流
#include"约瑟夫环.h"//引入头文件
using namespace std;
//主函数区域
int main() {
int m, n;
cout <<"请输入约瑟夫环人数以及密码\n";
cout &l文章来源地址53015.htmlt;<"人数n:";
cin >> n;
cout < cin >> m;
Josephus L(n);//创建一个约瑟夫环,环数为10
L.ResultShow(m);//定义密码m,输出出圈顺序
return 0;
}

下面是运行截图:

来源于:约瑟夫环的循环单链表实现(数据结构)


推荐阅读
  • 原标题:Python中numpy.power()函数介绍Python中numpy.power()函数介绍power(x,y)函数, ... [详细]
  • SOAR系统
    SOAR系统 ... [详细]
  • 智商狂飙,问了ChatGPT几个数据库问题后,我的眼镜掉了
    原标题:智商狂飙,问了ChatGPT几个数据库问题后,我的眼镜掉了最近,ChatGPT火爆全网,介绍其产品、公司、作者、技术和应用等方面信息,占据着整个互联网,似乎不谈GPT好像 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • 本文介绍了九度OnlineJudge中的1002题目“Grading”的解决方法。该题目要求设计一个公平的评分过程,将每个考题分配给3个独立的专家,如果他们的评分不一致,则需要请一位裁判做出最终决定。文章详细描述了评分规则,并给出了解决该问题的程序。 ... [详细]
  • 本文介绍了P1651题目的描述和要求,以及计算能搭建的塔的最大高度的方法。通过动态规划和状压技术,将问题转化为求解差值的问题,并定义了相应的状态。最终得出了计算最大高度的解法。 ... [详细]
  • 本文介绍了如何使用JSONObiect和Gson相关方法实现json数据与kotlin对象的相互转换。首先解释了JSON的概念和数据格式,然后详细介绍了相关API,包括JSONObject和Gson的使用方法。接着讲解了如何将json格式的字符串转换为kotlin对象或List,以及如何将kotlin对象转换为json字符串。最后提到了使用Map封装json对象的特殊情况。文章还对JSON和XML进行了比较,指出了JSON的优势和缺点。 ... [详细]
  • java.lang.Class.getDeclaredMethod()方法java.lang.Class.getDeclaredMethod()方法用法实例教程-方法返回一个Met ... [详细]
  • 以数据驱动品牌,为出海强势护航
                    原创
    原标题:以数 ... [详细]
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • yii2 绑定框架事件
    后端开发|php教程php,yii2后端开发-php教程我想要添加自定义代码处理yii2框架的Application::EVENT_BEFORE_REQUEST时触发的事件,但是不 ... [详细]
  • java线条处理技术_Java使用GUI绘制线条的示例
    在Java的GUI编程中,如何使用GUI绘制线条?以下示例演示了如何使用Graphics2D类的Line2D对象的draw()方法作为参数来绘制一条线。 ... [详细]
  • clickhouse 二(springboot+mybatis配置clickhouse,实现插入查询)
    原标题:clickhouse二(springboot+mybatis配置clickhouse,实现插入查询)开发步骤 ... [详细]
author-avatar
游走的小张
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有