还剩9页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
伍)*#夕*大导世岸花ECMwnrCM*.fM»■tBlMMnwoati《数据结构与算法设计》约瑟夫环实验报告一实验一专业物联网工程班级物联网班1学号姓名struct LNodeint num;struct LNode*next;};〃定义链表typedef struct LNode NODE;NODE*createlinklistintn〃初始化循环链表,并返回头指针NODE*head,*p,*q;inti=1;head=p=struct LNode*mallocsizeofstruct LNode;p-num=i;fori=2;i=n;i++q=structLNode*mallocsizeofstruct LNode;ifq==O returnO;p-next=q;p=q;p-num=i;}//使链表尾指向链表头,形成循环链表p-next=head;return head;voidjosephNODE*p,intn intm5{〃约瑟夫函数,用于输出约瑟夫环intij;NODE*q;fori=1;iv=n;i++//计算出列者序号forj=1;jm;j++p=p-next;q=p-next;p-next=q-next;freeq;p-next=NULL;void mainNODE*head;intn,s,m;inti;〃确定计算系数物理网班・・刘沛航115180118环绕圆桌的人数为从第儿人开始数到几的人出列〃确定头指针head=createlinklistn;ifs==1fori=1;in;i++head=head-next;elsefori=1;is-1;i++head=head-next;〃输出约瑟夫环出列顺序出列的顺序如下josephhead,n,m;
一、实验目的
1、熟悉VC环境,学习使用C语言利用链表的存储结构解决实际的问题
2、在编程、上机调试的过程中,加深对线性链表这种数据结构的基本概念理解
3、锻炼较强的思维和动手能力和更加了解编程思想和编程技巧
二、实验内容
1、采用单向环表实现约瑟夫环请按以下要求编程实现
①从键盘输入整数m,通过create函数生成一个具有m个结点的单向环表环表中的结点编号挨次为1,2,,.....ni
②从键盘输入整数s K=s=m和n,从环表的第s个结点开始计数为1,当计数到第n个结点时,输出该第n结点对应的编号,将该结点从环表中消除,从输出结点的下一个结点开始重新计数到n,这样,不断进行计数,不断进行输出,直到输出了这个环表的全部结点为止例如,m=10,s=3,n=4o则输出序列为6,10,4,9,5,2,1,3,8,7o
三、程序设计、概要设计1为了解决约瑟夫环的问题,我们可以建立单向环表来存储每个人的信息该人的编号以及其下一个人的编号,及结点,人后通过查找每一个结点,完成相应的操作来解决约瑟夫问题抽象数据类型定义1ADT Joh{数据对象D={a|a eElemSet,i=1,2,...,n,nN0}数据关系R1={a,a|a,a eD,i=1,2,...,ni-1i i-1i基本操作createJ,n操作结果构造一个有个结点的单向环表n JshowJ初始条件单向环表已存在J操作结果按顺序在屏幕上输出的数据元素Jcalculate J,s,n初始条件单向环表已存在,环表结点数J s0,n0,sv操作结果返回约瑟夫环的计算结果}ADT Joh宏定义2ttdefine NULL0^define OK1ttdefine ERROR-1主程序流程3开始输入数据(m,s,n创建环表输出建立好的环计算处理输出结果结束()模块调用关系--------------------4程序分为下述模块)主函数模块一一执行输入调用其他的功能函数1)创建环表模块一一创建单向环表2)计算处理模块一一计算出要出列的标号并输出3)显示模块一一输出建立好的环表4调用关系如下主函数模块创建环表模块显示%块计算处%模块、详细设计2数据类型设计1〃元素类型typedef intElemType;typedef struct{ElemType data;struct Joh*next;〃结点类型,指针类型}Joh,*LinkList,*p;⑵操作算法Status createLinkListJ,intn{〃创建一个有个结点的单向环表nifn=0错误return ERROR;//n0J=LinkListmallocsizeofJ;J-data=1;建立第一个结点J-next=J;//forinti=n;i1;-i{p=LinkListmallocsizeofJ;p-data=i;〃插入至表头p-next=J-next;J-next=p;ijreturn OK;}//create{〃主要的操作函数void showLinkListJ〃顺序输出环表的结点J;P=Jp=p-next;〃循环终止条件whilep!=J{p=p-next;}//showvoid calculateLinkListJJnt sintn{3P=J;〃声明结点Joh*head=p;whilep-data!=s{p=p-next;head=p;}//寻觅起始结点〃终止条件whilep-next!=p{forinti=0;in-1;i++{//保存前置节点head=p;p=p-next;//删除已输出结点head-next=p-next;p=head-next;ifn!=1else}//calculate主函数代码3{〃主函数int main//创建单向环表createJ m;j5showJ;//输出的数据JJoh*J;int ms n;35〃计算并输出结果calculateJ sn;55return0;}//main
四、程序调试分析
1、细节决定成败,编程最需要的是严谨,如何的严谨都无非分,往往检查了半天发现错误发生在某个括号,分号,引号,或者数据类型上在写主要操作函数caculate时,在终止条件的书写处不是很清晰,导致我浪费了不少时间、还有一点很大的感触就是,在自己绞尽脑汁都解决不了遇到2的问题时,一个很好的手段就是问询同学,寻求其匡助,就比如我在想函数终止条件时,同学一句简单的话语就让我如梦初醒这不是什么丢脸的事情,相反的,在快速解决问题的同时,还会收获友谊,不是一举两得吗我想,这也是合作学习的真谛吧
五、用户使用说明
1、本程序的运行环境为Windows操作系统下的MicrosoftVisual C++
6.0o
2、在VC环境下打开程序后,按要求键入要求的数字,以等号或者空格断开,敲击“回车符”,即可以显示要求的结果
3、按下任意键以继续
六、程序运行结果程序测试1程序测试2j•,C KAHQCSX j|F»S7C1^tug卜*“*4**»»*****«“打理H1班T£ISC118-刘沛I用续曲q的人故K10J,Y几人开邠现至几的人出列?一£列的顺序如下1865104923Press arykey tocontirwj^憎£楙音输入法全
七、程序清单#includestdio.h#includestdlib.h〃引用函数库。