《2023年数据结构约瑟夫环实验报告.docx》由会员分享,可在线阅读,更多相关《2023年数据结构约瑟夫环实验报告.docx(12页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、Bjina Uvwwiify of on4 UIcnnxxxoH0m处友年便大学世化。茂CEury C-Bco数据结构与算法设计约瑟夫环实验报告实验一专业:物联网工程 班级:物联网1班 学号:15 18 0 118姓名:刘沛航#include引用函数库struct LN ode |i nt num:st r uc t LNo d e * n ext;:定义链表t yp e def s tr u ct LNo d e NODE;NODE *c r eate 1 inkl i st( i n t n) (。/初始化循环链表,并返回I头指针NODE *h e a di n t i= 1 ;hcad=
2、p= (st r uct LNo d e*)mal 1 oc(si z co f (struct LNode);p n um= i ;for(i=2; i n ex t =q;p=q: p-n u m= i ;P next=head;使链表尾指向链表头,形成循环链表rct u rn head;v oid josep h (NO D E *p,in t n,int m)约瑟夫函数,用于输出约瑟夫环in t i,j;NODE *q;f or( i =l;inext;计算出列者序号q= p - n ext;p-next=q-n e xt;p rintf( %d ”, q-n u m);f r e e
3、(q);pne x t=NUL L ;v oid mai n ()NODE * h ead;int n ,s,m;in t i;/拟定计算系数1 51 8011 8 _文1沛航*pri n tf( * *水* * 物理网 1 班-* * * n);p rinIf(“围绕圆桌的人数为人n);scan f (%d ,&n);prinlf(从第几人开始? n);scanf( %d,&s);print f (“数到几的人出列?n);scan f ( %d,&m);。 拟定头指针head=c r e a t e linklist(n);。 i f (s= 1 )3 f o r(i=l;ine x t ;
4、 el s e。for(i=l;in e xt;。/ /输出约瑟夫环出列顺序pr i ntf (出列的顺序如下:n);jose p h(head, n , m);一、实验目的I、熟悉VC环境,学习使用C语言运用链表的存储结构解决实际 的问题。2、在编程、上机调试的过程中,加深对线性链表这种数据结构 的基本概念理解。3、锻炼较强的思维和动手能力和更加了解编程思想和编程技 巧。二、实验内容1、采用单向环表实现约瑟夫环。请按以下规定编程实现:从键盘输入整数m,通过cr e ate函数生成一个具有m个结点 的单向环表。环表中的结点编号依次为1, 2,mo从键盘输入整数s (k = sCm)和n,从环表
5、的第s个结点开始 计数为1,当计数到第n个结点时,输出该第n结点相应的编 号,将该结点从环表中消除,从输出结点的下一个结点开始重 新计数到n,这样,不断进行计数,不断进行输出,直到输出了 这个环表的所有结点为止。例如,m=l 0 , s =3, n=4o 则输出序列为:6, 10,4, 9,5, 2, 1, 3,8, 7o三、程序设计1、概要设计为了解决约瑟夫环的问题,我们可以建立单向环表来存储每 个人的信息(该人的编号以及其下一个人的编号),及结点,人 后通过查找每个结点,完毕相应的操作来解决约瑟夫问题。(1)抽象数据类型定义A D T Jo h 数据对象:D=q lq e ElemSet,
6、z = 1,2,.n 0。数据关系:Rl = 0, n0,s环表结点 数。操作结果:返回约瑟夫环的计算结果。 ADT Joh(2 )宏定义# d e f ine NULL 0# de fine OK 1# def i n e ERROR -1(3)主程序流程开始输入数据(m, s, n创建环表输出建立好的环计算解决输出结果结束(4) 模块调用关系程序分为下述模块:1)主函数模块一一执行输入调用其他的功能函数2)创建环表模块一一创建单向环表3)计算解决模块一一计算出要出列的标号并输出4)显示模块一一输出建立好的环表调用关系如下:主函数模块口创隼环表模块#示模块计算解决模块2、具体设计(1)数据类
7、型设计typ e d e f i nt ElemType; / / 元素类型typede f s t r uct oE 1 emType data;struc t Joh * next;Joh, *L i nkList,*p;/结点类型,指针类型(2)操作算法Stat u s c r e a te (LinkL i st &J,int n) 创建一个有n个结点的单向环表i f(n=0)oor e tu r n ERROR? / / n d a t a = 1;J-nex t =J;/ /建立第一个结点for(i n t i = n; i 1-i) 。p =(Lin k Lis t )ma 1
8、loc(sizeo f (J);p- d ata= i ;p-next=J-n e xt; J- n e x t=p;/ / 插入到表头。return OK; / / c r eatev oi d s h ow(Li n kL i s t J)重要的操作函数。顺序输出环表J的结点叩二J;print f (% d H,p-da t a);p= p -next;owhi 1 e(p!=J) /循环终止条件sprint f ( %d ”, p data);。p=p-n ext;/ / s howv oi d c a 1 cul a te (Li nkLis t J, in t s,i n t n)。
9、P = J ;Jo h *head=p; /声明结点owh i le (p-dat a != s ) p=p-next;ahe a d = p ;寻找起始结点ow h i 1 e(p-next!=p) 终止条件for ( i n t i=0;ine x t;。p rin t f(d n,p-data);ohe a d-next=p-n e xt; 删除已输出结点6 p = h e a d next;i f (n! = 1)p r i ntf(%dn ,p-data);else8 P rint f (nnn);/ / calculat e(3)主函数代码in t ma i n ()主函数Joh
10、*J;int m,s,n;printf( T he n um of node is:);-scanf( n %dn,&m);create(J ,m) ;/创建单向环表Js h ow(J);输出J的数据op r intf (nn);printf(H The fi r s t n ode whi c h y ou wa n t i soscanf(” d ,&s);p r intf(HThe i n te r n a 1 whi c h you wan t i s oscanf(% d n,&n);ocalcul a t e(J, s, n );计算并输出结果ret u r n 0; /mai n
11、四、程序调试分析1、细节决定成败,编程最需要的是严谨,如何的严谨都但是分, 往往检查了半天发现错误发生在某个括号,分号,引号,或者数据类 型上。在写重要操作函数cac ulate ()时,在终止条件的书写处不 是很清楚,导致我浪费了很多时间。2、尚有一点很大的感触就是,在自己绞尽脑汁都解决不 了碰到的问题时,一个很好的手段就是询问同学,寻求其帮助, 就比如我在想函数终止条件时,同学一句简朴的话语就让我如梦 初醒。这不是什么丢脸的事情,相反的,在快速解决问题的同时, 还会收获友谊,不是一举两得吗。我想,这也是合作学习的真谛 吧。五、用户使用说明1、本程序的运营环境为Windows操作系统下的Mi c r o s o ft Visual C+ 6. 0o2、在VC环境下打开程序后,按规定键入规定的数字,以等号或空格断开,敲击“回车符”,即可以显示规定的结果。3、按下任意键以继续。六、程序运营结果程序测试1:程序测试2:七、程序清单#incl u d e