1、2.4 查找search():2.5 输出序列linkout(): 52.6结构体设计:三、程序设计主流程 53.1总体设计:3.2详细流程图 6四、详细设计 74.1 link.h: 74.2 link.cpp:五、调试与测试 105.1 调试: 105.2测试: 13六、存在问题与体会: 146.1问题总结:6.2心得体会:一、需求分析约瑟夫环问题描述:编号为1,2,,n的n个人按顺时针方向坐一圈,每人持有一个密码(正整数)。一开始任选一个正整数作为报数上相值m,从第一个人开始按顺时针方向自1开始顺序报数,报到m时停止报数。报m的人出列,将他的密码作为新的m值,从他的顺时针方向上的下一个人
2、开始重新从1报数,如此下去,直至所有人全部出列为止。设计一个程序求出出列顺序。约瑟夫环问题主要是涉及到数据结构中的循环单链表的内容,通过插入链表,查询链表实现序列输出。开始主界面通过分支选择实现;主要的问题分为两个大部分,其一、是对循环单链表的创建,由于涉及到结构体和指针,因此可以通过将结构体与函数单独封装在头文件中,只有引用头文件即可,结构体内是基本的链表结构;其二、是搜索算法的涉及,思路是按照问题描述中:按初始密码查找标号修改初始密码,打印结果,改变链表结构再次搜查,直到链表内容清空为止结束搜索。其中剔除当前查找目标并将指针转到下一目标可通过将下一目标的密码及编号完全复制,删除下一目标,修
3、改当前目标的指针实现。使用C+语言设计,windows系统,数据结构:单向循环链表二、概要分析基本的欢迎界面打印。打印选择框图,并通过输入choice以switch-case语句实现功能选择,直接调用linkout(),实现序列输出。定义结构体(在2.6中详细说明)指针head、link、me,head=NULL创建一个没有头结点的单向循环链表,并采for(i=1;ihead时创建单向循环链表成功,并返回head的值。单项循环链表示意图:形式参数传入Linklist链表L,初始密码initialcode,及总人数num,在已经构建成的链表L中,以for(int i = 1; i = num;
4、i+)控制人数循环,for(int j = 1; j initialcode; j+) 实现按初始密码报数,当前循环结束时,已经遍历到要找的link指针指针指示的结点,将其密码赋值为初始密码后再将其直接后继的编号、密码完全复制,当前的节点就是与后继结点数据机构完全相同结点,改变指针next,并其删除后继结点构成新的循环链表。如此循环下去,直到最后变为空的单循环链表为止。声明变量,获取总人数,调用create(),构造链表,输入获取初始密码,调用search(),实现报数和结果序列输出。宏定义NULL 0 ;结构体中数据是编号num,密码code,指向下一结点的结构体指针 next。三、程序设计
5、主流程3.2详细流程图2 1NY四、详细设计Joseph:#define NULL 0typedef struct Node int num; /编号 int code; /密码 struct Node * next;Node, * Linklist;void mainmenu(); /主菜单void linkout(); /求出序列Linklist create(int n); /创建循环单链表void search(Linklist L,int initialcode,int num); /实现报数#include malloc.h#includestdlib.hctimeiostream
6、#include link.husing namespace std;void welcome() /欢迎界面 cout +-+n;| |n| 欢迎尝试约瑟夫环游戏 |nvoid mainmenu() /主界面 do char choice; choice = -1; cout choice; switch(choice) case 1: linkout(); break;2 cout 欢迎下次使用!退出. next = me; /将me指向的内存块(Node)连在单链表中 link = me; /将link指针指向me请输入第个人的密码: link-code; /通过输入获取当前编号下的密码
7、 link-num = i; /将编号放入link中第个人的密码:code next; /找到用link指向当前编号对应的内存地址 initialcode = link- /用当前查找的编号的密码更新初始密码num next-num;code = link- me = link-next = link- free(me);nnvoid linkout() int initialcode, num; Linklist L;输入初始人数: cin num; if(num = 30) L = create(num);输入初始密码: search(L, initialcode, num);nnnint
8、 main() welcome(); mainmenu(); system( return 0;五、调试与测试主界面:打印主界面,用户输入操作选择: 选择1:输入选项1并输入初始人数,开始键入每一个的编号密码:输入初始人数(7人),依次键入密码(3,1,7,2,4,8,4):打印出序列结果:利用循环返回主界面,若选择2退出:Joseph编号密码*nexthead32号地址3号地址74号地址45号地址56号地址687号地址结果预测:6 1 4 7 2 3 5测试结果:操作选项测试:输入选项预测结果测试结果-9无效提示进入退出a不输入1、当输入操作选择项是“afsfs”字符串时,会连续打印主界面。
9、2、在代码的细节有欠缺,当空指针时或是空链表时,未作处理。本次课程设计,在老师的总体指导下,对项目要求做了细致的分析,课程设计如果想完成,并非难事,而做细致些,做透彻些,做像样些,都不是一蹴而就的,网上资源非常多,我选择的题目“约瑟夫环问题”有很多人做过,但看的很多都有些小毛病,例如在输入数据特定,结果正确,真正多测试几次,会出现错误结果,还有在网上确实也存在不错的模版,不论是大的格式还是具体实现,都能比较清晰的展现出来,这是十分难得的,我也借鉴了比较好的几个方面,例如对于外部界面的书写,以及代码的优化,约瑟夫问题有很多小点可以多解决算法,而唯一相同的都是在单项循环列表的数据结构下操作数据的,
10、因此找到问题的主要是数据结构,问题就集中了,至于具体怎样实现,可以使因人而异;代码中全部属于自己编写,感觉先在书面上做好分析十分有效,以此为例,当对任务细分后,就变成两个小问题,一个是怎样创建一个单向循环链表,一个是怎样在已经存在的链表中实现“报数”查找及输出;单向链表比较容易,一个头指针指示链表总体,一个临时指针用于暂时存放输入的数据,还有一个移动指针随着链表的增长不断移动,以及移动过程中指针变换问题,在单向链表的基础上将末尾的指针指向头,就形成了环结构,就是所说的单向循环链表;至于搜索“报数”就是遍历链表结构,找到数据,提出数据,更新结构直到链表为空结束。在示例草图中演示结果,有了清晰思路,就可以完成本次任务。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1