数据结构与算法专题实验报告.doc
《数据结构与算法专题实验报告.doc》由会员分享,可在线阅读,更多相关《数据结构与算法专题实验报告.doc(29页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、附录A:报告格式数据结构与算法专题实验报告n 目 录附录A:报告格式1第一部分 题目3第1题 约瑟夫环31 题目32 目标33 设计思想34 算法描述45 程序流程图56 源程序5第2题 大数阶乘91 题目92 目标93 设计思想94 算法描述105 程序流程图116 源程序11第3题 图的遍历131 题目132 目标133 设计思想134 算法描述145 程序流程图156 源程序15第4题 最短路径191 题目192 目标193 设计思想194 算法描述205 程序流程图216 源程序23第二部分 体会与建议271体会与收获272建议与意见28第一部分 题目第1题 约瑟夫环1 题目: 用循环
2、链表实现约瑟夫(Yoseph)环整数)开始任选一个正整数作为报数值m,自第一个人开始按顺时针方向自1开始顺序报数,报到m时停止报数,报m的人出列,将他持有的密码作为新的m值,从他的顺时针方向的下一个人开始重新从1报数,如此下去,直至所有的人全部出列为止。编写完整的程序求出出列的顺序。2 目标: 1输入:从键盘输入人数n,n个人的密码以及初始m值。输入时应有提示,并有纠错措施。2输出:输出结果写入文件,包括n、n个密码、m和出列顺序。3 设计思想: 1 用单链表的数据结构实现约瑟夫环。2 创建单链表默认第i个结点的序号为i,获得第i个结点的数据(第个人的密码,并使其具有纠错功能, 用while
3、语句判断所输入的结点总数与第个个结点的数据是否在允许的范围内,如果在,则继续下去,如果不在,则返回重新输入。3 约瑟夫环中人员相继有规律的出列其实质是在单链表中连续删除结点直至剩余最后一个结点,当然它还满足一定的条件,那就是每删除一个结点后,下一个待删除的结点是从删除的结点的下一个结点开始计数,数到删除的结点的数据时,再次删除结点。4用文件输出则直接调用文件读取函数即可实现文件输出。4 算法描述: step1:定义单链表数据结构; step2: creat( )函数 /创建但链表,默认第i个结点的序号为i;a. 输入总的结点数n,并判断其是否在允许的范围内,如果不在,则返回,重新输入;b. f
4、or(icode并删除该结点,p=p-next else,从第i个结点计数,数到第m个结点,带回p-code并删除该结点,p=p-next; step4: fopen(t.out,w)实现文件的输出; step5: 主函数5 程序流程图: 6 源程序: / 用循环链表实现Yoseph环:#include /实现文件输出的头文件#include#include#define NUM 50static int aNUM; / 用来存放人数和初始密码值及出队序列int j=2,n;struct Yoseph /定义单链表数据结构 int num; int code; Yoseph *next;Yos
5、eph* creat( ) /创建单链表 int i,k=0; Yoseph *L,*p,*q;int n; printf(请输入总人数:n); scanf(%d,&n); a0=n; L=p=(struct Yoseph*)malloc(sizeof(Yoseph); p-num=1; printf(请输入第1个人手中所持的密码:n); scanf(%d,&p-code); while(p-codecode30) /设置密码的范围 printf(输入错误!请重新输入:n); scanf(%d,&p-code); aj=p-code;j+; for(i=2;inum=i; p-next=q;
6、p=q; printf(请输入第%d个人手中所持的密码:n,i); scanf(%d,&q-code); while(q-codecode20) printf(输入错误!请重新输入:n); /纠错功能 scanf(%d,&q-code); aj=q-code; j+; p-next=L; return L; void Disp(Yoseph* L) /输出出队序列 int k, m; struct Yoseph *p=L,*q; printf(请输入初始值: n); scanf(%d,&m); a1=m; printf(出列顺序如下:); while(p-next!=p) /直到剩下最后一个结
7、点才退出 if(m=1) printf(%3d,p-num); aj+=p-num; q-next=p-next; m=p-code; p=p-next; else for(k=1;knext; printf(%3d,p-num); aj+=p-num; q-next=p-next; m=p-code; /带回被删除的结点的数据,即出列的人手中的密码 p=p-next; printf(%3d,p-num); printf(n); aj=p-num; printf(出列完毕!); printf(n); void main( ) /主函数 int j; Yoseph * L; FILE *fpt;
8、 L=creat( ); Disp(L); fpt=fopen(t.out,w); / 调用文件输出语句,实现将结果存放在名为t.out的文件当中 fprintf(fpt,总人数为:); fprintf(fpt,%3dn,a0); fprintf(fpt,初始密码为:); fprintf(fpt,%3dn,a1); fprintf(fpt,n); fprintf(fpt,前%d个为密码,后%d个为出列人序号:,a0); for(j=2;jn+2;j+) /输出程序运行完毕后出列序列 fprintf(fpt,%3d,aj); for(j=n+2;j10)2 目标: 1. 掌握大数的处理方法 2.
9、 编程实现时应该考虑边界条件的处理。3 设计思想: 1 为实现大数阶乘,我们来看下面的分析:0!=1;1!=1; 2!=1+1;(1!加2次) 3!=2+2+2;(2!加3次) 4!=6+6+6+6;(3!加4次)n!=(n-1)!+(n-1)!+(n-1)!+(n-1)!+(n-1)!( (n-1)!加n次)1!=1;2!=1+1;3!=2+2+2;4!=6+6+6+6; n!=(n-1!)!+(n-1)!+ +(n-1)! (加n次)算n!要先算(n-1)!,然后再把它相加n次,可以用类似竖式加法实现。aMAXa3 a2 a1 a0 + aMAXb3 b2 b1 b0 aMAXa3 a2
10、a1 a02 还要考虑边界条件,负数无法求阶乘,太大的数求阶乘太耗时间,故确定范围0,NUM,在此范围内程序继续执行,超出这个范围,则返回重新输入。3 对一个数来说最高位不可能为0,设置从aMAXnumber开始扫描,遇到第一个不为0的数位时开始输出。4 算法描述: step1:定义数组的最大位数,定义存放最后结果和分布结果的数组a和b;step2: 输入并判断,符合,则继续,不符合,返回重新输入;step3: while(0nMAXnumber) a.初始化两个数组,a0=1,,输入所要求阶乘的那个数n;b.for语句(jn) 把每次求得的一个中间结果从a数组中复制到b数组中,for 语句(
11、mj)实现把b数组中所得的结果相加j次得j! step4:输出 ,从a数组的最后一个元素向前扫描,遇到第一个不为0的数字开始输出。5 程序流程图: 6 源程序: #include#define MAXnumber 3000 /定义数组的最大长度void main( ) int aMAXnumber,bMAXnumber; /定义存放结果的数组 int i,j,m,k,r,n; char ch=y; while(ch!=n) cout请输入你所想求阶乘的那个数:n; if(n1000) /设置大数的边界条件,大数求阶乘比较慢 cout你所输入的数字太大,请重新输入!n; while(n0) /设
12、置边界条件,负数无法求阶乘 cout对不起,输入错误,请重新输入!n; for(i=1;iMAXnumber;+i) ai=0; a0=1; for(j=2;j=n;+j) for(i=0;iMAXnumber;+i) bi=ai; for(m=1;mj;+m) for(i=0;i9) ai+1+; ai=r%10; k=MAXnumber-1; / 从数组末一个元素开始扫描,当遇到第一个不为0 的元素时开始输出 while(ak=0) -k; coutn=0;-i) coutai; coutendl; cout输入继续吗?是请键入“y”,退出键入“n”!ch; 返回第3题 图的遍历1 题目
13、现用Diskstra算法实现求最短路径2 目标 1.结点部少于30;2.可以从键盘或从文件输入结点数据,包括顶点信息、边、权等。3.从用户指定的顶点为起始点,输出该结点到其余各顶点的最短路径长度机器路径。3 设计思想 1 我采用二维数组实现输出图的邻接矩阵,对应行和列为顶点序号。2 在创建图时,设置顶点个数范围,设置顶点,权值,边数的范围。3 再输入边时采用以0,0,0结束,就是当我们把顶点,顶点,权值都输入0时,输入结束。4 最短路径设置双重循环,求得最短路径。4 算法描述: step1:定义顶点最大个数,无穷大时的权值为10000,存放边的n维数组costMAXMAX,最短路径distMA
14、X;step2:定义无向图数据结构;step3: creatgraph() /创建无向图a. 输入图的顶点个数,并判断0n=0&s=0&e0,如果不是,则返回,重新输入,最后以0,0,0结束输入;step4: shortdjs() /求最短路径a. for 语句(in)初始化权值,设置一个最短路径的起始点经过边数b. for语句(in) for语句(jn)寻找第I个结点到V0的直接路径; for 语句(in)寻找V0到第j 个结点的所有路径并把最小的放到disti中;step5: dispath() /输出最短路径step6: 直接调用creatgraph(), shortdjs(), dis
15、path()三个函数。5 程序流程图: 6 源程序: / 无向图的最短路径#include #define MAX 30 /顶点的最大个数#define up 1000 /当两顶点之间的权值为无穷大时,输出1000int costMAXMAX; /邻接表int distMAX,n; / 最短路径struct int num; int pnodeMAX; /途中经过的顶点 pathMAX; void creatgraph() /创建无向图 int i,j,s,e,len,contin=1; coutn;if (n=MAX) /纠错功能cout输入错误,请重新输入n;for(i=0;in;i+)
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 算法 专题 实验 报告
限制150内