C++循环链表之约瑟夫环的实现方法
本文实例形式展示了C++实现循环链表中约瑟夫环的方法,分享给大家供大家参考之用。具体方法如下:
主要功能代码如下:
#include <iostream> using namespace std; typedef struct student { int data; struct student* next; }node,*LinkList; //约瑟夫环 void printfList(LinkList head){ LinkList p=head; if (head!=NULL) { do{ cout<<p->data<<" "; p=p->next; }while(p!=head);//这里出现过问题,用do-while cout<<endl; } } void Josephus(int n,int k,int m){ int i=2; LinkList head=(LinkList)malloc(sizeof(node)); head->next=head; head->data=1; LinkList pre=head; while(i<=n){ LinkList p=(LinkList)malloc(sizeof(node)); p->data=i; p->next=pre->next; pre->next=p; pre=p; i++; } printfList(head); LinkList mend=pre; int kk=0; while(kk!=k){ mend=mend->next; ++kk; }//找到k个开始 while(n--){//要全部输出 int mm=1; pre=mend;//每次都要给pre从新复值否则程序错误 while(mm!=m){//不是要求的数,指针每次往前推一步,mend指向报数的人,pre指向前一个 pre=mend; mend=mend->next; mm++; } pre->next=mend->next;//前一个链到下一个准备报数的 cout<<mend->data<<endl; LinkList deletem=mend; mend=pre->next;//mend指向报数的人; free(deletem); //最后删除 } } int main(){ Josephus(13,4,1); return 0; }
希望本文所述对大家的C++程序设计有所帮助。
相关推荐
-
C++ 中约瑟夫环替换计数器m(数组解决)
C++ 中约瑟夫环替换计数器m(数组解决) 题目描述: 输入一个由随机数组成的数列(数列中每个数均是大于0的整数,长度已知),和初始计数值m.从数列首位置开始计数,计数到m后,将数列该位置数值替换计数值m,并将数列该位置数值出列,然后从下一位置从新开始计数,直到数列所有数值出列为止.如果计数到达数列尾段,则返回数列首位置继续计数.请编程实现上述计数过程,同时输出数值出列的顺序 比如: 输入的随机数列为:3,1,2,4,初始计数值m=7,从数列首位置开始计数(数值3所在位置) 第一轮计数出列数字为
-
C++ 中循环链表和约瑟夫环
循环链表和约瑟夫环 循环链表的实现 单链表只有向后结点,当单链表的尾链表不指向NULL,而是指向头结点时候,形成了一个环,成为单循环链表,简称循环链表.当它是空表,向后结点就只想了自己,这也是它与单链表的主要差异,判断node->next是否等于head. 代码实现分为四部分: 初始化 插入 删除 定位寻找 代码实现: void ListInit(Node *pNode){ int item; Node *temp,*target; cout<<"输入0完成初始化"&
-
C++ 约瑟夫环的实例代码
C++ 约瑟夫环的实例代码 约瑟夫环是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围.从编号为k的人开始报数,数到m的那个人出列:他的下一个人又从1开始报数,数到m的那个人又出列:依此规律重复下去,直到圆桌周围的人全部出列. 分析:有n个人,要想所有的人都退出去,只有每个人喊到m,才可以退完,所以可以算出,n*m为所有人总共报数的总次数. 代码: /* * 约瑟夫出圈 */ #include <stdio.h> int main() { char peo[
-
C语言基于循环链表解决约瑟夫环问题的方法示例
本文实例讲述了C语言基于循环链表解决约瑟夫环问题的方法.分享给大家供大家参考,具体如下: 概述: 约瑟夫环问题,是一个经典的循环链表问题,题意是:已知 n 个人(以编号1,2,3,-,n分别表示)围坐在一张圆桌周围,从编号为 k 的人开始顺时针报数,数到 m 的那个人出列:他的下一个人又从 1 还是顺时针开始报数,数到 m 的那个人又出列:依次重复下去,要求找到最后出列的那个人. 例如有 5 个人,要求从编号为 3 的人开始,数到 2 的那个人出列: 出列顺序依次为: 编号为 3 的人开始数 1
-
C++循环链表之约瑟夫环的实现方法
本文实例形式展示了C++实现循环链表中约瑟夫环的方法,分享给大家供大家参考之用.具体方法如下: 主要功能代码如下: #include <iostream> using namespace std; typedef struct student { int data; struct student* next; }node,*LinkList; //约瑟夫环 void printfList(LinkList head){ LinkList p=head; if (head!=NULL) { do
-
javascript循环链表之约瑟夫环的实现方法
前言 传说在公元1 世纪的犹太战争中,犹太历史学家弗拉维奥·约瑟夫斯和他的40 个同胞被罗马士兵包围.犹太士兵决定宁可自杀也不做俘虏,于是商量出了一个自杀方案.他们围成一个圈,从一个人开始,数到第三个人时将第三个人杀死,然后再数,直到杀光所有人.约瑟夫和另外一个人决定不参加这个疯狂的游戏,他们快速地计算出了两个位置,站在那里得以幸存.写一段程序将n 个人围成一圈,并且第m个人会被杀掉,计算一圈人中哪两个人最后会存活.使用循环链表解决该问题. 看到这个问题首先想到的是要用到循环链表,还有就是要计算
-
JavaScript三种方法解决约瑟夫环问题的方法
目录 概述 问题描述 循环链表 有序数组 数学递归 总结 概述 约瑟夫环问题又称约瑟夫杀人问题或丢手绢问题,是一道经典的算法问题.问题描述也有很多变式,但大体的解题思路是相同的.本篇将以循环链表.有序数组.数学递归三种方式来解决约瑟夫环问题. 问题描述 先来看一下什么是约瑟夫环问题? 在罗马人占领乔塔帕特后,39 个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓到,于是决定了一个自杀方式,41个人排成一个圆圈,由第1个人开始报数,每报数到第3人该人就必须自杀
-
Python实现约瑟夫环问题的方法
本文实例讲述了Python实现约瑟夫环问题的方法.分享给大家供大家参考,具体如下: 题目:0,1,...,n-1这n个数字排成一个圆圈,从数字0开始每次从这个圆圈里删除第m个数字.求出这个圆圈里剩下的最后一个数字. 定义函数f(n,m),表示每次在n个数字(0,1,...,n-1)中每次删除第m个数字后最后剩下的数字. 在n个数字中,假设第一个被删除的数字为k,那么删除k之后剩下的n-1个数字为0~k-1,k 1~n-1,并且下一次删除从数字k 1开始计数.第二个序列最后剩下的数字也就是我们要求
-
PHP实现约瑟夫环问题的方法分析
本文实例讲述了PHP实现约瑟夫环问题的方法.分享给大家供大家参考,具体如下: 一.概述 先来看看网上比较常见的约瑟夫环问题描述:约瑟夫环(约瑟夫问题)是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围.从编号为k的人开始报数,数到m的那个人出列:他的下一个人又从1开始报数,数到m的那个人又出列:依此规律重复下去,直到圆桌周围的人全部出列.通常解决这类问题时我们把编号从0~n-1,最后结果+1即为原问题的解. 二.实现代码 1. 循环 function circ
-
python超简单解决约瑟夫环问题
本文实例讲述了python超简单解决约瑟夫环问题的方法.分享给大家供大家参考.具体分析如下: 约瑟环问题大家都熟悉.题目是这样的.一共有三十个人,从1-30依次编号.每次隔9个人就踢出去一个人.求踢出的前十五个人的号码: 明显的约瑟夫环问题,python实现代码如下: a = [ x for x in range(1,31) ] #生成编号 del_number = 8 #该删除的编号 for i in range(15): print a[del_number] del a[del_numbe
-
深入理解约瑟夫环的数学优化方法
首先,约瑟夫环的数学优化方法为: 为了讨论方便,先把问题稍微改变一下,并不影响原意:问题描述:n个人(编号0~(n-1)),从0开始报数,报到(m-1)的退出,剩下的人继续从0开始报数.求胜利者的编号.我们知道第一个人(编号一定是(m-1)%n) 出列之后,剩下的n-1个人组成了一个新的约瑟夫环(以编号为k=m%n的人开始): k k+1 k+2 ... n-2, n-1, 0, 1, 2, ... k-2 并且从k开始报0.现在我们把他们的编号做一下转换:k --> 0 k+1 -->
-
详解基于C++实现约瑟夫环问题的三种解法
目录 一.前言 二.循环链表模拟 三.有序集合模拟 四.递归公式解决 五.结语 一.前言 什么是约瑟夫环问题? 约瑟夫环问题在不同平台被"优化"描述的不一样,例如在牛客剑指offer叫孩子们的游戏,还有叫杀人游戏,点名--最直接的感觉还是力扣上剑指offer62的描述:圆圈中最后剩下的数字. 问题描述: 0,1,···,n-1这n个数字排成一个圆圈,从数字0开始,每次从这个圆圈里删除第m个数字(删除后从下一个数字开始计数).求出这个圆圈里剩下的最后一个数字. 例如,0.1.2.3.4这
-
php基于环形链表解决约瑟夫环问题示例
本文实例讲述了php基于环形链表解决约瑟夫环问题.分享给大家供大家参考,具体如下: 先来重温一下约瑟夫环问题:N个人围成一圈,从第一个开始报数,第M个将被杀掉,最后剩下一个,其余人都将被杀掉.例如N=6,M=5,被杀掉的顺序是:5,4,6,2,3,1. 前面介绍了关联数组解决约瑟夫环的方法,环形链表解决约瑟夫环的方法如下: <?php header("content-type:text/html;charset=utf-8"); class Child{ public $no;
随机推荐
- perl中的$a和$b介绍
- Flex 基于数据源的Menu Tree实现代码
- VBS教程:方法-GetAbsolutePathName 方法
- AngularJS入门教程之表格实例详解
- 使用Java实现串口通信
- perl 读取所需文件的路径,然后打开相应的文件
- C# 没有动态的数组,可以用arraylist或list取代
- asp.net根据计算机MAC地址限定每台机子只能领取一次账号
- asp中常用的字符串安全处理函数集合(过滤特殊字符等)
- 实例详解Android快速开发工具类总结
- php中二分法查找算法实例分析
- DL.DT.DD实现左右的布局简单例子第1/2页
- 图文详解C语言位运算基础知识
- Java用Cookie限制点赞次数(简版)
- JavaScript基本类型值-Number类型
- ARP病毒入侵原理和解决方案
- 最近较流行的效果 Android自定义View实现倾斜列表/图片
- Android蓝牙通信编程
- Android编程使用内容提供者方式(ContentProvider)进行存储的方法
- python使用fork实现守护进程的方法