双向循环链表实现约瑟夫环

约瑟夫环问题(C语言版)——双向循环链表和静态链表实现 文章目录题目描述双向循环链表静态链表法公式法 约瑟夫环问题,也称圆桌问题,解决的方案很多,在此,给出三种解决方案,双向循环链表,静态链表和公式法 题目描述 编号为1,2,…,n的n个人按顺时针方向围坐在一张圆桌周围,每人持有一个密码(正整数)。一 开始任选一个正整数m作为报数上限值,从第一个人开始按顺时针方向自1开始报数,报到m时停止报数,报m的那个人出列,将他的密码作为新的m值,从他顺时针方向的... 阅读详情

      今天,我们来讲讲双向循环链表约瑟夫环,小编解读的摇摆约瑟夫环的原理:输入一定人数的同学,成环排列,每个人携带一个密码,给出一个上限值,指针从第一个同学走到第上限值个同学,这个同学出队,且把它携带的密码存起来,指针走向她的下一个同学,又向前找到第上限值个同学,这个同学出队并存入她的密码值,指针指向他的前一个,之后又重复上面步骤,直到所有同学出队,密码完全生成。原理如上那么我们该如何实现呢?

      首先,在实现约瑟夫环前我们需要实现双向循环链表,实现双向循环链表先实现双向链表,在它的基础上添加一个实现循环函数。那么如何实现一个双向链表呢?我们可以紧紧抓住它的名字:双向、链表,我们需要构造出这两个东西,链表由一个个节点,双向-两个指针即此节点的前继(存前一个节点地址)和后驱(存后一个节点地址),为了实现约瑟夫环,节点里还需要有序列号和每个人所携带的密码值即数据域。这样我们就建好了一个节点的架子,实现链表,无非就是这样的很多节点串起来,像链条一样,由于是双向链表,我们可以在任意节点处向前或向后找到目标节点,这也弥补了单向链表的不足。

      之后我们需要考虑,它需要实现的一些功能。链表既然是一种存储结构与数据紧密相连,为数据而生,那么它的基本功能肯定与数据脱不了干系,对数据的操作增、删、改、查。最后由于是个循环链表,功能函数里也包含循环构成函数,形成约瑟夫环取出密码又需要得知环中人数和上限值,最后还要把取出密码打印出。此处又涉及到获得人数的函数、输入上限值的函数、得到密码的函数。总的来说所有函数包括增函数、删函数、改函数、查函数、求链表长度函数、这些函数声明和节点定义写在头文件中方便使用。如图:

      接下来,我们会详细说一下部分主要函数,首先,是增函数即插入函数(这里我们用的尾插),其传入参数为环中总人数。尾插函数作用就是产生节点并且链接节点,尾插逻辑:产生节点我们声明并使用指针变量并用malloc为它分配内存,输入序列号和携带的一个密码值,在声明一个指针front指向它,防止它被篡改。之后使用for循环创建总人数减一个节点并链接,front的下一个地址指向新插入这个指针变量,并且把这个指针变量的后一个指向置为空(防止后面野指针访问),把front指针移向这个新指针变量,尾插逻辑就是这样。如图:

     循环函数,其逻辑就是找到尾节点,把尾节点的next改为指向头结点,把头结点的前继指针指向尾节点。如图:

      求链表长度函数较好的方法是使用do-while()函数,int len=0;在头指针不会空的情况下,新建一个指针front指向头指针所指,防止改变和破坏头指针,在do-while()中len++,且front指针后移,循环停止条件是front==head,在第一次执行到此处时,front早已指向第一个节点的下一个。如图:

      取密码函数,也是解决这个问题的最关键的一个部分之一,实现原理的关键。先判断表是否为空,之后依然新声明一个cur3指针变量指向第一个节点,作用跟前面一样。因为这个指针需要顺时针走后逆时针走,那么电脑什么时候知道往哪里走呢,这就需要做个标记,int p=0;存入数组时需要知道是哪个下标,所以int k=0;保证队里人数都走完需要循环,又为了不轻易改动传入的总人数值,创建一个与他同值的变量j利用while循环。循环里由p值决定走顺还是逆,顺的话,利用for循环cur3后移上限值减一步(因为指针本身在第一个节点)走到第上限值个节点,退出循环,存下此节点的密码值,且下标++,之后找到此节点的前一个节点,把此节点的next赋给前一个节点,且此节点的next节点的前继指向此节点的前一个节点,把此节点的前继和后驱置空,此节点的指针cur3又把它指向它原来的下一个节点修改p=1;为了下次逆时针执行,走了一个人,j--。下一次执行p不为0执行else语句。也就是逆时针移动,利用for循环cur3前移上限值减一步(因为指针本身在第一个节点)走到第上限值个节点,退出循环,存下此节点的密码值,且下标++,找到cur3的后一个节点,把后一个节点的前继改为cur3的前继,又把cur3的前继的后驱改为cur3 的后继,cur3的前继和后驱置空,移动cur3指针指向cur3 的原来的前一个节点,修改标记p=0,人数 j--。如此往复直到人走完。如图: 

      以上就是小编对双向循环链表实现约瑟夫环的理解,若有错,麻烦您指出,小编很想进步!感谢!!(以上代码块不完全哦!)

用双向循环链表实现约瑟夫环的原理与工程实践 约瑟夫环是理解循环结构与动态删除的经典算法模型,其本质需求在于高效完成节点的定位、移除与环状遍历。双向循环链表凭借O(1)时间复杂度的前驱/后继访问能力,天然适配‘删节点后立即从下一节点继续’的核心逻辑,避免了单向链表中反复查找前驱的O(n)开销。在C#泛型实现中,DoubleLinkNode<T>封装值与双向指针,CircleList<T>通过First/Last/Count三态协同维护环的完整性,而索引器this[int]的双向查找优化则体现了对时间复杂度的工程级权衡。本文以手写链表解约瑟夫环为切口,深 阅读详情

相关推荐

双向链表实现约瑟夫环

已知N个人(以编号1,2,3...n分别表示)围成一个圈。 从编号为K的人开始报数,数到M的那个人出列,他的下一个人又从1开始报数,依照此规律重复下去,直到圆圈中的人全部出列。 问题:请打印出这N个的人出列的编号。 双向链表实现的

线性表,双向链表,静态链表,循环链表(约瑟夫环)

通过前面的学习我们知道,具有“一对一”逻辑关系的数据,最佳的存储方式是使用线性表。那么,什么是线性表呢?线性表,全名为线性存储结构。使用线性表存储数据的方式可以这样理解,即“把所有数据用一根线儿串起来,再存储到物理空间中”。图 1 "一对一"逻辑关系的数据如图 1 所示,这是一组具有“一对一”关系的数据,我们接下来采用线性表将其储存到物理空间中。首先,用“一根线儿”把它们按照顺序“串”起来,如图 2 所示:图 2 数据的"线性"结构。

ZhangJiqun&191cm&85kg 691

数据结构 用双向链表实现约瑟夫环

数据结构大作业,c++用双向链表实现约瑟夫环,内含.h与.cpp

算法与数据结构 --- 约瑟夫环变种(双向)

题目简述 假设现在有n个人,围成一个从1到n的环。 先顺时针的方向数RRR个人,数到RRR的人出局,将自己手里的牌子给下一个人。然后逆时针数LLL个人,第LLL个人出局,将自己手里的牌子给下一个人(逆时针),然后再顺时针,再逆时针,直到最后剩下max(L,R)−1max(L,R)-1max(L,R)−1个人为止,输入为n R L,输出为最后手里令牌最多的人的序号以及令牌数量。 思考 注意顺序是有序的,先顺时针然后再逆时针,方向可以用一个bool变量来控制。 本文直接利用数组来做的,因此要注意环,当越界的时

flow_specter的博客 692

双向约瑟夫问题(顺时针再逆时针)

n个人排成一个圆圈,从第一个人开始,先按顺时针方向,数m,数到m的人退出圆圈,然后从原有方向的下一个人开始,按原来顺序的反方向继续数m,依次数数,直到只剩最后一个人为止。比如有5个人,数3,则依次出去的人为3,1,4,5,2,最后的人是2号。现已知n和m,请问最后一个人的编号是多少?

【C语言】双向、循环链表实现约瑟夫环

约瑟夫环有很多种问法,这里举例了其中一种,不过都大同小异 已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围, 每个人都有自己的一个密码。 从第一个人开始报数,数到m(初始设定)的那个人出列; 他的下一个人又从1开始报数,数到刚出列的那个人的密码时又出列; 依此规律重复下去,直到圆桌周围的人全部出列。 最后一人为胜者。

C语言双向循环链表的实现及约瑟夫环问题

看了这篇博主写的关于动态链表的文章,感触颇深,今天我就以c语言来实现双向循环列表并解决约瑟夫环问题。 (4条消息) 数据结构:动态链表(C语言描述)_知道什么是码怪吗?的博客-CSDN博客 一.约瑟夫环问题 已知 n 个人(以编号 1,2,3,…,n 分别表示)围坐在一张圆桌周围,从编号为 k 的人开始顺时针报数,数到 m 的那个人出列;他的下一个人又从 1 还是顺时针开始报数,数到 m 的那个人又出列;依次重复下去,要求找到最后出列的那个人? 例如有 5 个人,要求从编号为 3 的人开始,数到..

qq_51938362的博客 1448

双向循环链表解决约瑟夫环问题

用双向循环链表解决约瑟夫环问题的程序清单

4. 双向约瑟夫问题

4. 双向约瑟夫问题

czh_vegetable的博客 1073

【python快速编程入门(第二版)黑马程序员课后编程题】

python快速编程入门(第二版)黑马程序员课后编程题

weixin_46167259的博客 1万+

从桨叶设计到电机匹配:手把手教你调出无人机最佳动力组合

本文系统介绍了无人机动力系统的核心匹配原则,重点解析了如何通过测试与数据分析,优化螺旋桨与电机的组合,从而显著提升系统力效与续航。文章提供了从参数解读、实战测试到深度调优的完整指南,帮助开发者解决电机过热、推力不足等常见问题,实现无人机性能最大化。

weixin_29305313的博客 230

利用双向循环链表实现约瑟夫环问题(C++版)

1.问题简述    约瑟夫环(约瑟夫问题)是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。通常解决这类问题时我们把编号从0~n-1,最后结果+1即为原问题的解。 2.实现思路 (1)建立一个孩子类(相当于数据结构中的...

马马也的个人博客 2684

高德地图轨迹回放,消息框内展示车辆速度且随车辆移动-升级支持调整速度、回放进度

使用高德地图回放车辆GPS轨迹,并添加速度和回放进度条,并支持调整,效果如下: 新增的功能: 在基础版本,有如下升级 速度条:可以拖动以调整车辆回放速度,且从当前位置继续回放 进度条:进度条表示车辆已回放的百分比,且拖动进度条车辆定位到相应的位置并继续回放 ###思路分析 高德和marker回放相关的API //主要靠他回放 moveAlong(path:Array,speed:Number,f:Function,circlable:Boolean) //点移动到另一个位置,移动进度条车辆跟随移动

博客 1万+

C++学习笔记(4):约瑟夫环的实现:双向循环链表方法

简介:本程序使用双向循环链表实现了约瑟夫环 ,查的数m 大于 n 也是可以的。 下面的程序可以直接复制使用,也可以下载压缩包。代码都没有问题 0引言: 约瑟夫环的题目:来自网址:https://max.book118.com/html/2017/0114/83642198.shtm 本程序的基本思想和上图所介绍的基本一致,使用的是 双向循环链表 来实现的。 ...

Zhao_Water的博客 730

RC滤波电路工作原理:【带图+公式计算】

容抗Xc和电容C成反比,和频率f也成反比,C越大,交流电容易通过电容,说明电容量大,电容的阻碍作用小;交流电的频率高,交流电也容易通过电容,说明频率高,电容的阻碍作用也小。我们可以看到,一个2V的纹波,经常RC电路后,幅值下降到mv级别,基本可以忽略不计,这就是RC滤波电路的工作原理。一个频率为1Khz的信号,通过一个容值为0.1uf的电容,计算电容对该信号产生的阻抗。将RC滤波器电路中的电阻,取值为1KΩ,电容取值为0.47uf,纹波幅值为2V。从公式1可以看到,Xc越大,Vout值就越接近Vin的值。

weixin_66299220的博客 2万+

数字摄影与摄像中的图像信号处理器(ISP):流程与经典算法详解

图像信号处理器(Image Signal Processor, ISP)是现代数字成像系统(如智能手机、数码相机、网络摄像头等)中的核心组件,扮演着将图像传感器(如CMOS或CCD)捕获的原始光电信号转换为高质量、可供观看或进一步处理的数字图像的关键角色。在数字摄影和摄像的整个链路中,光线首先通过镜头(Lens)聚焦到图像传感器上,传感器将光信号转换为模拟电信号,随后经过模数转换(A/D转换)变为原始的数字图像信号。

qq_44682523的博客 3709

用双向循环链表实现约瑟夫环

我们要剔除一个值,但只用一个变量,在我们删除的时候,这个变量值消失,我们就无法找到这个链表,所以我们要用两个变量,记录当前值和前一个的值,循环的条件为,当前的链表中只有一个元素,2.为了使这个链表是正序的状态,应该使用尾插法(注意第一个元素中肉节点的指向)1.每一个人是一个节点,要将每个人标号,并添加到这个链表中。3.这是个环,要将最后一个元素指向头节点。第二个接口是,查看这个环,看看自己初始化是否正确。C语言中运用双向循环链表写约瑟夫环。第三个接口,开始进行游戏。

IDLLO的博客 365

图像去雾新思路:手把手教你复现DEA-Net中的“细节增强卷积”与PyTorch实现

本文详细解析了DEA-Net中的'细节增强卷积'(DEConv)与PyTorch实现,通过多分支差分卷积和重参数化技术,显著提升单图像去雾效果。文章从数学原理到代码实现,手把手指导复现这一创新架构,帮助开发者在保持轻量化的同时实现41dB以上的PSNR指标,适用于自动驾驶、遥感监测等关键领域。

weixin_30323631的博客 501

C++双向循环链表实现约瑟夫环

C++双向链表实现约瑟夫环 欢迎使用Markdown编辑器 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。 新的改变 我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写博客: 全新的界面...

猫的薛定谔 2605

EtherCAT主站教程3--适配伺服驱动器(模式配置)

目前通用的伺服驱动器的位置模式、速度模式以及其他模式是伺服系统中常见的控制模式,切换这些模式通常需要根据具体的伺服驱动器型号和控制协议(如EtherCAT、CANopen、Modbus等)进行配置。以下是这些模式的概述及切换方法的一般性指导:协议规范中,一共有以下几种模式:其中模式1、3、6对于比较常用,也更容易上手。

weixin_52626887的博客 792

Linux Kernel入门到精通系列讲解 - 总目录

在学习Linux Kernel之前,需要先准备开发环境,方便后续进行开发。可以根据自身情况,选择性阅读该章节。学习该章节之前,你应该了解一下网络概念,明白为什么要讲这些,才能更有方向的去理解学习。Linux ARM平台开发系列讲解(设备树篇) 4.1.1 设备树的原理详解。本项目完全开源,仅供学习使用,如需其他用途,请与本人联系。),本章节你可以学习到。摄像头V4L2子系统、Linux kernel常用的子系统等,ARM架构、RISCV架构、Uboot等。

DSMGUOGUO的博客 1万+

03 单链表、双向链表、循环链表(约瑟夫环问题)及代码实现

链表 1. 链表介绍 内存中的存储方式: 链表是以节点的方式来存储,是链式存储 。 每个节点包含 data 域, next 域:指向下一个节点。 如图:发现链表的各个节点不一定是连续存储。 链表分带头节点的链表和没有头节点的链表,根据实际的需求来确定。 单链表(带头结点) 逻辑结构示意图如下: 2. 单链表的实现 节点定义: /** * 英雄节点类 */ class HeroNode { public int no; public String name; p

朱古力的博客 483

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

2.13双向循环链表及创建(C语言)

我们知道,单链表通过首尾连接可以构成单向循环链表,如图 1 所示: 图 1 单向循环链表示意图 同样,双向链表也可以进行首尾连接,构成双向循环链表。如图 2 所示: 图 2 双向循环链表示意图 当问题中涉及到需要 "循环往复" 地遍历表中数据时,就需要使用双向循环链表。例如,前面章节我们对约瑟夫环问题进行了研究,其实约瑟夫环问题有多种玩法,每次顺时针报数后,下一轮可以逆时针报数,然...

weixin_42437172的博客 1963

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

【数据结构】链表相关——单链表/循环链表/双向链表/学生管理系统单链表实现/约瑟夫环/多项式加法

【数据结构】链表相关——单链表/循环链表/双向链表/学生管理系统单链表实现/约瑟夫环/多项式加法

sakuraqwqqqqq的博客 770

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

数据结构项目——使用循环链表实现约瑟夫环(循环和双向链表实现)

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

流楚丶格念的博客 4469

双向链表的约瑟夫游戏C语言,C语言通过双向循环链表解决Josephus(约瑟夫)问题

题目描述:n个人围坐一圈,标号1-n,从s开始报数,第m个报的人出列,一直循环下去直到所有人出列。设计一算法,输入n,m,s,输出出列顺序。这个问题有好多种算法,这里用双向循环链表实现的/**use two-directioned looped linkedList*/#include using namespace std ;class node{public:node* last ;node*...

weixin_36352023的博客 562
上一篇: 泛型------Java
下一篇: 数据结构------链表
扶苏瑾
博客等级 码龄2年 26粉丝 26原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值