约瑟夫生死者游戏
- 格式:doc
- 大小:33.50 KB
- 文档页数:9
约瑟夫⽣死游戏约瑟夫⽣死游戏⼀、约瑟夫⽣死游戏30个⼈围成⼀个圈由第⼀个⼈数起,依次报数,数到第九个⼈,便把他剔除,然后再从他的下⼀个⼈数起,数到第九个⼈,再将他剔除剩下15个乘客为⽌,问那些位置将是被扔下⼤海的位置。
⼆、实验⽬的n个⼈围成⼀个圈由第⼀个⼈数起,依次报数,数到第x个⼈,便把他剔除,然后再从他的下⼀个⼈数起,数到第x个⼈,再将他剔除,依次继续,直到剩下的⼈数⼩于等于n/2。
三、功能分析1、构建约瑟夫链表:使整个游戏在链表中运⾏,使得结点在删除时不需要移动⼤量的结点;2、确定n的值:进⽽使链具化体,从⽽可以构建⼀个具体的链表;3、更新链表:对剔除结点后的链表进⾏重新连接,构成⼀个新的链表,使得循环继续进⾏;4、输⼊:输⼊n的值进⾏链表具体化,输⼊间隔值m,使得间隔被确定,程序得以有效正确的进⾏;5、输出:输出要剔除的结点的数值。
四、系统设计1、利⽤类定义构造成员函数以及成员templateclass List{public:List(){first=new LinkNode;first->link=first;}List(T x){first=new LinkNode(x);first->link=first;}List(List&L);~List(){}void Insert(int i,T x);T getHead(){return first->data;}LinkNode* getfirst(){return first;}void xiuf(LinkNode* a){first=a;} LinkNode*Locate(int i); protected:LinkNode*first;};2、定义成员函数templateList::List(List&L){T value;LinkNode*srcptr=L.getHead(); LinkNode*destptr=first=new LinkNode; destptr->data=srcptr->data;while(srcptr->link!=first){value=srcptr->link->data;destptr->link=new LinkNode(value); destptr=destptr->link;srcptr=srcptr->link;last=srcptr;}};templateLinkNode* List::Locate(int i){if(i<0)return NULL;LinkNode* current=first;int k=1;while(k{current=current->link;k++;if(current==first)return NULL;}return current;};3、创建含有n个结点的单循环链表队列的顺序表⽰和实现和顺序栈相似,在队列的顺序存储结构中,除了⽤⼀组地址连续的存储单元依次存放从队列头到队列尾的元素之外,尚需附设两个指针front和rear分别指⽰队列头元素及队列尾元素的位置。
[阅读材料]世界名题与小升初之:抽杀问题(約瑟夫问题)--马到成功老师在各类竞赛中,各类小升初考试中相关的世界名题出现的概率极高,这是由小升初与数学竞赛的特点决定,这特点便是:知识性,趣味性,思想性相结合。
先给大家介绍这一问题的由来。
据说著名犹太历史学家Josephus有过以下的故事:在罗马人占领乔塔帕特後,39 個犹太人与Josephus及他的朋友躲到一個洞中,39個犹太人決定宁愿死也不要被人抓到,于是決定了一个自杀方式,41個人排成一个圆圈,由第1個人开始报数,每报数到第3人该人就必須自杀,然后再由下一个重新报数,直到所有人都自杀身亡为止。
然而Josephus 和他的朋友并不想遵从,Josephus要他的朋友先假装遵从,他將朋友与自己安排在第16個与第31個位置,于是逃过了这场死亡游戏。
解法約瑟夫问题可用代数分析來求解,将这个问题扩大好了,假设现在您与m个朋友不幸参与了这个游戏,您要如何保护您的朋友?只要画两个圆圈就可以让自己与朋友免于死亡游戏,这两个圆圈是排列顺序,而外圈是自杀顺序,如下图所示:使用程式来求解的话,只要将阵列当作环状来处理就可以了,在列中由计数1开始,每找到三个无资料区就填入一个计数,直接计数來求解的話,只要將阵列当作环状来处理就可以了,在阵列中由計数1开始,每找到三个无资料区就填入一个計数,直而計数达41为止,然后將阵列由索引1开始列出,就可以得知每个位置的自杀順序,这就是約瑟夫排列,41個人报数3的約瑟夫排列如下所示:14 36 1 38 15 2 24 30 3 16 34 4 25 17 5 40 31 6 18 26 7 37 19 8 35 27 9 20 32 10 41 21 11 28 39 12 22 33 13 29 23由上可知,最后一個自杀的是在第31个位置,而倒数第二个自杀的要排在第16个位置,之前的人都死光了,所以他们也就不知道約瑟夫与他的朋友并没有遵守游戏规则了。
第五人格约瑟夫怎么玩《摄影师:从入门到自闭》1.地图基础摄影师应当精确掌握所有求生者点位,以便在第一张照片的60秒内尽可能多地找到镜像。
2.地图进阶为了实现第一张照片内攻击效益最大化,摄影师应当有清晰的找人路线。
针对军工厂木屋下方出生点的说明。
摄影师对地图的熟悉程度与胜率成正比,而且这个屠夫需要记的信息比其他屠夫更细,不光要记无敌点、电机点、出生点,最好连箱子的位置、容易藏身的草丛、墙角、雪堆都要记住。
救人位(前锋、佣兵、空军)的镜像如果是第一个被找到的,他们很可能会去摸自己的镜像。
3.倒地寻人一般来说第一张相片过后至少有一人倒地,这时如果有求生者朝着没有电机的方向过去,或者转点时明显避开某些无敌点,可以前往那边寻找。
有经验的屠夫对求生者遛鬼与转点的具体路线应该心中有数,不符合常态的逃跑路径是寻找倒地求生者的线索。
4.回溯守三连机5.操作摄影师是不需要逮虾户那种操作,不是不需要操作。
请熟练掌握闪现捡人、闪现震慑、回溯躲枪、回溯上脸等技能。
掌握1、2点中的基础内容可以轻易上三阶,上四阶需要更多的意识,五阶之后需要的是减少失误。
配合拍照CD,摄影师比别的屠夫更容易把握比赛的时间。
镜像崩塌的一瞬间是最佳的暗杀时机。
在镜像中摄影师与求生者容易远远地互相看见,如果要从现实到镜像进行暗杀,建议朝别的方向走几步。
有祭司时挂地下室应谨慎,因为这种情况下如果选择贴脸守人就必须放弃跳楼刀,否则极可能被偷。
跳楼刀在地下室能发挥出意想不到的效果。
另外有一个小技巧,当把人挂在背靠地下室楼梯的椅子上时,哪怕第一次跳楼刀失败,利用闪现突然闪过去,有时甚至可以打出落地震慑刀。
落地瞬间出刀,打中求生者也算落地刀,取消擦刀动作。
如果在镜像崩塌前确认没有时间挂调香师,可以在最后一秒打镜像一刀。
回溯可以有效制裁调香师、祭司、前锋等职业。
调香师在镜像外使用香水后进入镜像,回溯后不会回到镜像外。
暗杀对盲女最有效。
6.车队遇到车队是没法避免的,这辈子不可能躲开车队的,摄影师如果碰到医生+牛仔、医生+前锋、医生+祭司或者医生+祭司+牛仔/前锋+机械师这一类组合,建议前期一定要守死一个,后期配合一刀斩保平。
约瑟夫生死游戏(C++)数据结构实现本文档为约瑟夫生死游戏的C++数据结构实现文档,旨在详细介绍如何使用C++语言实现约瑟夫生死游戏的功能。
1:引言1.1 背景约瑟夫生死游戏是一个经典的数学问题,由约瑟夫·斯特恩提出。
问题描述如下:有n个人围成一圈,从某个人开始,每次顺时针报数m个人,报到m的人出局,直到剩下最后一个人为止。
1.2 目的本文档旨在指导开发人员使用C++语言实现约瑟夫生死游戏的功能,包括实现报数、出局等基本操作,并提供相应的测试样例和使用说明。
2:设计2.1 数据结构设计约瑟夫生死游戏的核心是一个环形链表,链表中的每个节点代表一个人。
每个节点包含两部分数据:该人的编号和指向下一个节点的指针。
链表的最后一个节点指向第一个节点,形成环形结构。
2.2 算法设计- 初始化链表:根据输入的人数创建相应数量的节点,并通过指针连接起来,形成环形链表。
- 报数出局:从指定的起始位置开始顺时针遍历链表,依次报数,当报到m时,将该节点从链表中移除。
- 判断游戏结束:当只剩下最后一个节点时,游戏结束。
2.3 功能设计- 初始化游戏:根据输入的人数和报数间隔,创建约瑟夫生死游戏实例。
- 开始游戏:执行报数出局操作,直到游戏结束。
- 获取胜利者:返回最后剩下的节点的编号。
3:实现下面给出C++语言实现约瑟夫生死游戏的核心代码。
```cppinclude<iostream>using namespace std;// 定义环形链表节点结构体struct Node {int id;Node next;};class JosephusGame {public:// 构造函数,初始化环形链表JosephusGame(int n, int m) {// 创建第一个节点Node firstNode = new Node;firstNode->id = 1;firstNode->next = NULL;// 依次连接剩余节点Node prevNode = firstNode;for (int i = 2; i <= n; i++) { Node newNode = new Node; newNode->id = i;newNode->next = NULL;prevNode->next = newNode;prevNode = newNode;}// 最后一个节点和第一个节点,形成环形结构prevNode->next = firstNode;// 初始化成员变量this->head = firstNode;this->count = n;this->interval = m;}// 游戏主循环void playGame() {Node currentNode = this->head;while (this->count > 1) {// 找到要出局的节点的前一个节点for (int i = 1; i < this->interval; i++) { currentNode = currentNode->next;}// 删除当前节点Node removedNode = currentNode->next; currentNode->next = removedNode->next; delete removedNode;this->count--;// 移动当前节点到下一个节点currentNode = currentNode->next;}}// 获取胜利者的编号int getWinner() {return this->head->id;}private:Node head; // 链表头节点int count; // 当前剩余人数int interval; // 报数间隔};int mn() {int n, m;cout << \。
盛年不重来,一日难再晨。
及时宜自勉,岁月不待人。
数据结构实践教程前言数据结构是计算机专业的必修。
主干课程之一,它旨在使读者学会分析研究数据对象的特性,学会数据的组织方法,以便选择合适的数据逻辑结构和存储结构,以及相应的运算(操作),把现实世界中的问题转化为计算机内部的表示和处理,这是一个良好的程序设计技能训练的过程。
在整个教学或学习过程中,解题能力和技巧的训练是一个重要的环节。
为了帮助教师讲授“数据结构”,满足指导和评价“课程设计”的需要,为了帮助和指导读者更好地学习数据结构这门课程,我们特编写了这本《数据结构实践教程》辅助教材,旨在弥补课堂教学和实验中的不足,帮助学生充分理解和巩固所学的基本概念、原理和方法,达到融会贯通、举一反三的目的。
实践证明,理解课程内容与较好地解决实际问题之间存在着明显差距,而算法设计完成的质量与基本的程序设计素质的培养是密切相关的。
要想理解和巩固所学的基本概念。
原理和方法,牢固地掌握所学的基本知识。
基本技能,达到融会贯通。
举一反三的目的,就必须多做。
多练。
多见(见多识广)。
正是为了达到上述目的,书中用一些实际的应用,对一些重要的数据结构和算法进行解读。
经过循序渐进地训练,就可以使读者掌握更多的程序设计技巧和方法,提高分析。
解决问题的能力。
本书根据学生的基础知识和兴趣爱好将内容分为基础篇和提高篇两个部分。
第一部分基础篇精选出适当的、与实际生活结合密切的课程设计实例加以分析实现。
第二部分提高篇旨在使读者通过运用数据结构知识及复杂算法去解决现实世界中的一些实际问题。
本书依据数据结构课程教学大纲要求,同时又独立于具体的教科书,既重视实践应用,又重视理论分析,本书的主要特点有:●本书精选出来的实例项目经典、实用、具有一定的趣味性,其内容丰富、涉及面广、难易适当,能给读者以启发,达到让读者掌握相关知识和开阔视野的目的●为了提高学生分析问题、解决问题的能力,本书对实例项目进行分析,其设计思路清晰流畅,值得参考。
“约瑟夫”问题及若干变种林厚从例1、约瑟夫问题(Josephus)[问题描述]M只猴子要选大王,选举办法如下:所有猴子按1…M编号围坐一圈,从第1号开始按顺序1,2,…,N报数,凡报到N的猴子退出到圈外,再从下一个猴子开始继续1~ N报数,如此循环,直到圈内只剩下一只猴子时,这只猴子就是大王。
M和N由键盘输入,1≤N,M≤10000,打印出最后剩下的那只猴子的编号。
例如,输入8 3,输出:7。
[问题分析1]这个例题是由古罗马著名史学家Josephus提出的问题演变而来的,所以通常称为Josephus(约瑟夫)问题。
在确定程序设计方法之前首先来考虑如何组织数据,由于要记录m只猴子的状态,可利用含m 个元素的数组monkey来实现。
利用元素下标代表猴子的编号,元素的值表示猴子的状态,用monkey[k]=1表示第k只猴子仍在圈中,monkey[k]=0则表示第k只猴子已经出圈。
程序采用模拟选举过程的方法,设变量count表示计数器,开始报数前将count置为0,设变量current表示当前报数的猴子编号,初始时也置为0,设变量out记录出圈猴子数,初始时也置为0。
每次报数都把monkey[current]的值加到count上,这样做的好处是直接避开了已出圈的猴子(因为它们对应的monkey[current]值为0),当count=n时,就对当前报数的猴子作出圈处理,即:monkey[current]:=0,count:=0,out:=out+1。
然后继续往下报数,直到圈中只剩一只猴子为止(即out=m-1)。
参考程序如下:program josephus1a {模拟法,用数组下标表示猴子的编号}const maxm=10000;var m,n,count,current,out,i:integer;monkey:array [1..maxm] of integer;beginwrite('Input m,n:');readln(m,n);for i:=1 to m do monkey[i]:=1;out:=0; count:=0; current:=0;while out<m-1 dobeginwhile count<n dobeginif current<m then current:=current+1 else current:=1;count:=count+monkey[current];end;monkey[current]:=0; out:=out+1; count:=0end;for i:=1 to m doif monkey[i]=1 then writeln('The monkey king is no.',i);readlnend.[运行结果]下划线表示输入Input m,n:8 3The monkey king is no.7 {时间:0秒}Input m,n:10000 1987The monkey king is no.8544 {时间:3秒}[反思]时间复杂度很大O(M*N),对于极限数据会超时。
约瑟夫之谜的名词解释约瑟夫之谜:逃避死亡的智慧在古老的历史长河中,有许许多多的谜团流传至今,其中一道引人瞩目的谜题,就是约瑟夫之谜。
这个谜题如同一道脑筋急转弯,令人陷入思考的深渊中。
究竟什么是约瑟夫之谜?本文将以一种旁征博引的方式,深入探讨这个神奇而又深沉的谜题。
约瑟夫之谜,也被称为约瑟夫环问题,源自古罗马时期。
据传,约瑟夫是一位年纪轻轻却头脑聪慧的犹太人。
敌对的罗马军队包围了他的城市,他们的终极目标就是夺取约瑟夫的性命。
为了逃过一劫,约瑟夫和他的朋友们决定采取一种不同寻常的生存策略。
命运的时间步骤过于残酷:每隔一定的时间,罗马军队会选择一个固定的顺序排列的人杀掉。
为了保住自己的生命,约瑟夫们决定在一个迷人而又难解的游戏中挣扎。
他们决定按照固定的顺序围着一个圆圈坐下,每当轮到某个人遭到宣判时,他后面的人会立即被杀掉。
当约瑟夫和他的朋友们面对这个可怕而又无情的游戏时,他们拥有一个独特的优势:他们都是聪明的思考者。
他们知道,唯一可以保证自己生命延续的方法就是找到一个特殊的座位,以便在他们被罗马军队宣判之前逃走。
而解决此难题的方法,正是约瑟夫之谜的核心。
约瑟夫和他的朋友们经过长时间的思考和讨论,最终得出结论:他们必须假装接受宣判并立即逃走。
他们以此方式不断循环,直到只剩下最后一个人。
通过观察若干个这样的循环,他们发现一个神奇的数学准则:最后一个幸存者的座位总是环中的第n个人。
找到这个规律之后,约瑟夫和他的朋友们在面对死亡的恐惧时,找到了一丝希望和智慧。
他们可以以这种方式延长自己的存活时间,尽管最终没有人能够永远逃脱。
但这个故事中的约瑟夫告诉我们,面对绝望时,思考和创新是人类的强大武器。
约瑟夫之谜,通过一种看似无意义的数学模式,揭示了我们在面对逆境时的思考方式。
这个谜题也引起了许多数学家和研究者的兴趣,他们试图寻找背后的数学规律和解释。
在当代,约瑟夫之谜被广泛应用于许多领域,如计算机科学、游戏理论和密码学等。
游戏规则电影《生死狙击》是一部以游戏规则为主题的电影,讲述了一群职业杀手在一场生死狙击游戏中展开了殊死搏斗的故事。
影片以游戏规则为基础,通过精彩的剧情和惊险的场面,展现了杀手们在游戏规则下的生死较量,以及他们之间的复杂关系和内心挣扎。
故事发生在一个名为“生死狙击”的秘密组织中,这个组织由一群富豪和政要组成,他们每年都会举办一场生死狙击游戏,邀请全球范围内的顶尖杀手参与。
游戏的规则非常简单:参与者需要在规定的时间内,通过各种手段消灭其他参与者,最后存活下来的人将获得丰厚的奖金和荣誉。
影片的主角是一名名叫杰克的职业杀手,他是一名退伍军人,拥有精湛的狙击技巧和冷静的头脑。
杰克接到了生死狙击的邀请,他决定参加这场比赛,以期望获得奖金来改善自己的生活。
然而,当他进入游戏后,才发现这场游戏并不像表面上那么简单,每个参与者都是经过严格选拔的精英杀手,他们拥有各种高科技武器和装备,而且都有着自己的目的和秘密。
在游戏中,杰克遇到了许多强大的对手,他们之间展开了一场场惊心动魄的狙击对决。
在这个过程中,杰克不仅要应对对手的攻击,还要面对自己内心的挣扎和矛盾。
他开始怀疑自己的选择,他是否值得为了金钱和荣誉而去杀戮其他人,他是否能够忍受自己的良心和道德的谴责。
除了狙击对决,影片还展现了杰克和其他参与者之间的复杂关系。
有些人是他的朋友,有些人是他的敌人,而有些人则是他的替身。
他们之间的争斗和矛盾,使得整个游戏显得更加扣人心弦。
同时,影片也揭示了生死狙击组织内部的黑暗和阴谋,以及背后的政治和商业利益。
最终,杰克在一次次生死狙击中,历经千辛万苦,最终存活了下来。
然而,当他获得奖金和荣誉的时候,他却发现这一切并不能让他得到内心的平静和满足。
他开始反思自己的选择和行为,重新审视自己的人生和价值观。
最终,他决定离开生死狙击组织,追寻自己的内心和未来。
《生死狙击》以游戏规则为基础,通过精彩的剧情和惊险的场面,展现了杀手们在游戏规则下的生死较量,以及他们之间的复杂关系和内心挣扎。
黄淮学院“数据结构”课程设计报告系(院):计算机科学系设计题目:专业班级:小组成员:指导教师:完成时间:2009~2010学年第二学期[问题描述]约瑟夫(Joeph)问题的一种描述是:编号为1,2,…,n的n个人按顺时针方向围坐一圈,每人持有一个密码(正整数)。
一开始任选一个正整数作为报数上限值m,从第一个人开始按顺时针方向自1开始顺序报数,报到m时停止报数。
报m 的人出列,将他的密码作为新的m值,从他在顺时针方向上的下一个人开始重新从1报数,如此下去,直至所有人全部出列为止。
试设计一个程序求出出列顺序。
[基本要求]利用单向循环链表存储结构模拟此过程,按照出列的顺序印出各人的编号。
[测试数据]m的初值为20;密码:3,1,7,2,4,8,4(正确的结果应为6,1,4,7,2,3,5)。
[实现提示]程序运行后首先要求用户指定初始报数上限值,然后读取各人的密码。
设n≤30。
一、需求分析二、概要设计说明本程序中用到的所有抽象数据类型的定义、主程序的流程以及各程序模块之间的层次(调用)关系。
typedef struct Node{int Index; 在当前环中所处的位置,即编号int Password; 在当前环中的所带的密码struct Node *next;}JosephuNode;使用单循环链表创建约瑟夫环JosephuNode *Creat_Node(int numbers)约瑟夫环void Josephu(JosephuNode *head,int Password)三、详细设计实现概要设计中定义的所有数据类型,对每个操作只需要写出伪码算法;对主程序和其他模块也都需要写出伪码算法。
本程序主要是以建立单循环链表的形式,建立起一个约瑟夫环,然后根据之前创立的结点,输入结点里的一些数据,如下typedef struct Node{int Index; 在当前环中所处的位置,即编号int Password; 在当前环中的所带的密码struct Node *next;}JosephuNode;程序有主函数开始,首先,提示输入创建约瑟夫环环数以及每个环上所带的密码。
然后,开始调用JosephuNode *Creat_Node函数,利用单循环链表建立起约瑟夫环,tail->next = head;就是将最后一个结点的后继指向头结点,函数结尾return head; 将约瑟夫环的头指针返回,并将它赋值head,然后主函数继续调用Josephu函数,通过讲head和Password引入函数,以建立两个嵌套循环输出并实现如下功能:编号是1,2,……,n的n个人按照顺时针方向围坐一圈,每个人只有一个密码(正整数)。
一开始任选一个正整数作为报数上限值m,从第一个仍开始顺时针方向自1开始顺序报数,报到m时停止报数。
报m的人出列,将他的密码作为新的m值,从他在顺时针方向的下一个人开始重新从1报数,如此下去,直到所有人全部出列为止。
四、设计与调试分析无论是用链表实现还是用数组实现都有一个共同点:要模拟整个游戏过程,不仅程序写起来比较烦,而且时间复杂度高达O(nm),当n,m非常大(例如上百万,上千万)的时候,几乎是没有办法在短时间内出结果的。
我们注意到原问题仅仅是要求出最后的胜利者的序号,而不是要读者模拟整个过程。
因此如果要追求效率,就要打破常规,实施一点数学策略。
为了讨论方便,先把问题稍微改变一下,并不影响原意:问题描述:n个人(编号0~(n-1)),从0开始报数,报到(m-1)的退出,剩下的人继续从0开始报数。
求胜利者的编号。
我们知道第一个人(编号一定是m%n-1) 出列之后,剩下的n-1个人组成了一个新的约瑟夫环(以编号为k=m%n的人开始):k k+1 k+2 ... n-2, n-1, 0, 1, 2, ... k-2并且从k开始报0。
现在我们把他们的编号做一下转换:k --> 0k+1 --> 1k+2 --> 2......k-2 --> n-2k-1 --> n-1变换后就完完全全成为了(n-1)个人报数的子问题,假如我们知道这个子问题的解:例如x是最终的胜利者,那么根据上面这个表把这个x 变回去不刚好就是n个人情况的解吗?!!变回去的公式很简单,相信大家都可以推出来:x‘=(x+k)%n如何知道(n-1)个人报数的问题的解?对,只要知道(n-2)个人的解就行了。
(n-2)个人的解呢?当然是先求(n-3)的情况---- 这显然就是一个倒推问题!好了,思路出来了,下面写递推公式:令f表示i个人玩游戏报m退出最后胜利者的编号,最后的结果自然是f[n]递推公式f[1]=0;f=(f[i-1]+m)%i; (i>1)有了这个公式,我们要做的就是从1-n顺序算出f的数值,最后结果是f[n]。
因为实际生活中编号总是从1开始,我们输出f[n]+1由于是逐级递推,不需要保存每个f,程序也是异常简单:#include <stdio.h>int main(void){int n, m, i, s=0;printf ("N M = "); scanf("%d%d", &n, &m);for (i=2; i<=n; i++) s=(s+m)%i;printf ("The winner is %d\n", s+1);}这个算法的时间复杂度为O(n),相对于模拟算法已经有了很大的提高。
算n,m等于一百万,一千万的情况不是问题了。
可见,适当地运用数学策略,不仅可以让编程变得简单,而且往往会成倍地提高算法执行效率。
五、用户手册注:任意输入一个数据后进入系统,然后根据系统提示操作即可。
六、测试成果七、附录(源程序清单)#include <stdio.h>#include <malloc.h>typedef struct Node{int Index;int Password;struct Node *next;}JosephuNode;/////////////////////////////////////////////// 使用单循环链表创建约瑟夫环JosephuNode *Creat_Node(int numbers){int i,pass;JosephuNode *head, *tail;head = tail = (JosephuNode *)malloc(sizeof(JosephuNode)); //申请头结点for (i = 1; i <numbers; ++i){tail->Index = i;printf("\t\t请输入第%d号所带密码: ",i); //输入当前结点所带密码scanf("%d",&pass);tail->Password=pass;tail->next = (JosephuNode *)malloc(sizeof(JosephuNode)); //申请一个新结点tail = tail->next; //指针指向下一个结点}tail->Index = i;printf("\t\t请输入第%d号所带密码: ",i);scanf("%d",&pass);tail->Password=pass;tail->next = head; //将尾结点指针指向表头return head;}//Creat_Node///////////////////////////////////////////////// 约瑟夫环void Josephu(JosephuNode *head,int Password){int i,j;JosephuNode *tail;for (i = 1; tail != head; ++i){for (j = 1; j <Password; ++j){tail = head;head = head->next;}tail->next = head->next;printf("\n\t\t第%d个出局的人的编号是:%d\t密码是:%d",i,head->Index,head->Password);Password=head->Password;free(head);head = tail->next;}i =head->Password;j=head->Index;printf("\n\t\t第7个出局的人的编号是:%d\t密码是:%d\n",j,i);free(head);} //Josephu/////////////////////////////////////void main(){int numbers, Password;char stop;JosephuNode *head;printf("\t\t----------------- 约瑟夫环问题-----------------\n");printf("\t\t例如:输入约瑟夫问题的人数和起始密码:7,20\n");printf("\t\t---------------------------------------------------\n");do{printf("\t\t开始...\n\t\t输入约瑟夫环问题的人数和起始密码:");scanf("%d,%d", &numbers, &Password);head=Creat_Node(numbers);printf("\t\t---------------\n");printf("\t\t输出结果如下\n");Josephu(head,Password);printf("\t\t-----------------------------------------------\n");printf("\t\t是否继续进行?是Y(y),否N(n)\t");getchar();scanf("%c",&stop);getchar();printf("\t\t-----------------------------------------------\n");}while(stop=='y'||stop=='Y');}八、课程设计心得此程序目前的缺点在于,结点密码数据类型定义的存储类型是int型,不能超过-2147483648~2147483648,一旦超过则程序输出结果有误,另一个缺点就是程序运行当中,一旦中途输入出现错误,则无法返回,必须将当前操作结束等到下个主函数的循环开始,或者直接退出重新运行此程序。