数据结构实验报告—约瑟夫问题求解

数据结构实验报告—约瑟夫问题求解

ID:46445622

大小:145.04 KB

页数:15页

时间:2019-11-23

数据结构实验报告—约瑟夫问题求解_第1页
数据结构实验报告—约瑟夫问题求解_第2页
数据结构实验报告—约瑟夫问题求解_第3页
数据结构实验报告—约瑟夫问题求解_第4页
数据结构实验报告—约瑟夫问题求解_第5页
资源描述:

《数据结构实验报告—约瑟夫问题求解》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、《计算机软件技术基础》实验报告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.本程序所能达

2、到的基本可能:该程序基于循环链表来解决约瑟夫问题。用循环链表来模拟n个人围坐一圈,用链表中的每一个结点代表一个人和他所代表的密码。在输入初始密码后m,对该链表进行遍历,直到第m个结点,令该结点的密码值作为新的密码值,后删除该结点。重复上述过程,直至所有的结点被释放空间出列。2.输入输出形式及输入值范围:程序运行后提示用户输入总人数。输入人数n后,程序显示提示信息,提示用户输入第i个人的密码,在输入达到预定次数后自动跳出该循环。程序显示提示信息,提示用户输入初始密码,密码须为正整数且不大于总人数。3.输出形式提示用户输入初始密码,程序执行结束后会输出相应的出列结点的

3、顺序,亦即其编号。用户输入完毕后,程序自动运行输出运行结果。4.测试数据要求:测试数据n=7,7个人的密码依次为:3,1,7,2,4,8,4。m初值为6(正确的出列顺序应为6,1,4,7,2,3,5)。三、概要设计为了实现上述功能,应用循环链表来模拟该过程,用结构体来存放其相应的编号和密码信息,因此需要循环链表结构体这个抽象数据类型。1.循环链表结构体抽象数据类型定义:ADTNode{数据对象:D={ai,bi,ci

4、ai∈int,bi∈int,ci∈(Node*),i=1,2...,n,n≥0}:数据关系:R=∅基本操作:CreatList(intn)//构建循

5、环单链表;Order(intm,node*l)//输出函数,输出出列顺序并删除链表中的结点;}ADTnode;2.ADT的C语言形式说明:typedefstructNode{intnum;//结点的数据域,存放编号;intword;//结点的数据域,存放密码;structNode*next;//结点的指针域,存放指向下一结点的指针;}Node;Node*CreatList()//建立循环单项链表;voidOrder(Node*h)//输出出列顺序并删除结点;3.主程序流程及其模块调用关系:1).主程序流程:先提示用户输入相关数据:总人数,运行循环链表结构体模块,输

6、入每个人持有的密码值,创建出新链表,运行输出函数模块,再输入初始密码m值,输出出列序列。(创建循环单链表模块:实现链表的抽象数据类型删除链表结点输出序列模块:实现输出出列顺序)2).模块调用关系:删除链表结点输出序列模块创建循环链表结构体模块主函数模块四、详细设计1.元素类型、结点类型和结点指针类型:typedefstructNode//定义一个结构体,包含了每个人的序号和密码{intword;intnum;structNode*next;}Node;2、创建单向循环链表类型:Node*CreatList()//尾插法创建一个单向循环链表{Node*p,*s;No

7、de*h;//定义头指针h=(Node*)malloc(sizeof(Node));//申请动态存储空间p=h;h->next=NULL;//初始化链表printf("第1个人的密码是:");scanf("%d",&h->word);h->num=1;//给头指针赋值for(i=0;inext==NULL)h->next=s;elsep->next=s;p=s;printf("第%d个人的密码是:",i+2);scanf("%d",&s->word);s->num=i+2;

8、}p->next=h;returnh;}3.删除链表结点输出函数模块:voidOrder(Node*h)//输出结果{Node*p;p=h;Node*d;while(p->next!=p){if(m<2){p=p->next;}else{for(i=1;inext;}}d=p->next;m=d->word;printf("%d--",d->num);p->next=d->next;//删除结点p=p->next;free(d);}printf("%d",p->num);}4.主函数:voidmain(){pri

9、ntf("

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。