- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
数据结构实验报告—约瑟夫问题求解.
《计算机软件技术基础》 实验报告I—数据结构实验一、约瑟夫斯问题求解一、问题描述1.实验题目:编号1,2,....,n的n个人顺时针围坐一圈,每人持有一个密码(正整数)。 开始选择一个正整数作为报数上限m,从第一个人开始顺时针自1报数,报到m的人出列,将他的密码作为新的m值,从他在顺时针方向下一个人开始重新从1报数,直至所有人全部出列。 2.基本要求:利用单向循环链表存储结构模拟此过程,按照出列的顺序印出个人的编号。3.测试数据:n=7,7个人的密码依次为:3,1,7,2,4,8,4.m初值为6(正确的出列顺序应为6,1,4,77,2,3)。二、需求分析 1.本程序所能达到的基本可能: 该程序基于循环链表来解决约瑟夫问题。用循环链表来模拟n个人围坐一圈,用链表中的每一个结点代表一个人和他所代表的密码。在输入初始密码后m,对该链表进行遍历,直到第m个结点,令该结点的密码值作为新的密码值,后删除该结点。重复上述过程,直至所有的结点被释放空间出列。2.输入输出形式及输入值范围:程序运行后提示用户输入总人数。输入人数n后,程序显示提示信息,提示用户输入第i个人的密码,在输入达到预定次数后自动跳出该循环。程序显示提示信息,提示用户输入初始密码,密码须为正整数且不大于总人数。 3.输出形式提示用户输入初始密码,程序执行结束后会输出相应的出列结点的顺序,亦即其编号。用户输入完毕后,程序自动运行输出运行结果。4.测试数据要求:测试数据n=7,7个人的密码依次为:3,1,7,2,4,8,4。m初值为6(正确的出列顺序应为6,1,4,7,2,3,5)。三、概要设计为了实现上述功能,应用循环链表来模拟该过程,用结构体来存放其相应的编号和密码信息,因此需要循环链表结构体这个抽象数据类型。1.循环链表结构体抽象数据类型定义:ADT Node{ 数据对象:D={ai,bi,ci|ai∈int, bi∈int,ci∈(Node*),i =1,2...,n,n≥0}:数据关系:R=? 基本操作:CreatList(int n) //构建循环单链表; Order(int m,node *l)//输出函数,输出出列顺序并删除链表中的结点;}ADT node;2. ADT的C语言形式说明:typedef struct Node { int num; //结点的数据域,存放编号; int word; //结点的数据域,存放密码; struct Node *next; //结点的指针域,存放指向下一结点的指针;}Node;Node *CreatList( )//建立循环单项链表;void Order(Node *h) //输出出列顺序并删除结点; 3. 主程序流程及其模块调用关系:1).主程序流程:先提示用户输入相关数据:总人数,运行循环链表结构体模块,输入每个人持有的密码值,创建出新链表,运行输出函数模块,再输入初始密码m值,输出出列序列。(创建循环单链表模块:实现链表的抽象数据类型删除链表结点输出序列模块:实现输出出列顺序)2).模块调用关系:删除链表结点输出序列模块创建循环链表结构体模块主函数模块四、详细设计1.元素类型、结点类型和结点指针类型:typedef struct Node //定义一个结构体,包含了每个人的序号和密码{int word; int num; struct Node *next;}Node;2、创建单向循环链表类型:Node *CreatList() //尾插法创建一个单向循环链表 { Node *p,*s; Node *h; //定义头指针 h=(Node*)malloc(sizeof(Node)); //申请动态存储空间 p=h; h-next=NULL; //初始化链表 printf(第1个人的密码是:); scanf(%d,h-word); h-num=1; //给头指针赋值 for(i=0;in-1;i++) { s=(Node*)malloc(sizeof(Node)); if(h-next==NULL) h-next=s; else p-next=s; p=s; printf(第%d个人的密码是:,i+2); scanf(%d,s-word); s-num=i+2; } p-next=h; return h; }3.删除链表结点输出函数模块: void Order(No
文档评论(0)