ImageVerifierCode 换一换
格式:DOCX , 页数:30 ,大小:97.87KB ,
资源ID:10818115      下载积分:10 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/10818115.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(数据结构与算法说明书.docx)为本站会员(b****8)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

数据结构与算法说明书.docx

1、数据结构与算法说明书数据结构与算法课程设计题 目: 求素数问题 猴子吃桃问题 跳马问题 排序重构问题 。 目 录目 录 2摘 要 4一求素数问题 51.数据结构设计 52.算法设计 53.调试分析 64.测试结果 65.源程序(带注释) 6二构造可以使n个城市连接的最小生成树 81.数据结构设计 92.算法设计 93.调试分析 104.测试结果 115.源程序(带注释) 12三猴子吃桃问题 19.数据结构设计 192.算法设计 193.调试分析 214.测试结果 215.源程序(带注释) 224排序重构问题 241.数据结构设计 242.算法设计 243、流程图如下: 254、调试分析 255

2、、测试结果 256、源程序(带注释) 26总 结 30参考文献 31致 谢 31摘 要此报告是关于四个问题的设计:求素数问题、猴子吃桃子问题、跳马问题、哈夫曼的编/译码系统。1. 求素数问题。埃拉托色尼筛法(Sieve of Eratosthenes)是一种用来求所有小于N的素数的方法。从建立一个整数2N的表着手,寻找i的整数,编程实现此算法,并讨论运算时间。(1)2. 猴子吃桃子问题。有一群猴子摘了一堆桃子,他们每天都吃当前桃子的一半且再多吃一个,到了第10天就只余下一个桃子。用多种方法实现求出原来这群猴子共摘了多少个桃子。要求:1)采用数组数据结构实现上述求解;2)采用链式数据结构实现上述

3、求解;3)采用递归实现上述求解。(2)3. 跳马问题。要求在64个国际象棋格子,任意位置放一个马,如何不重复地把格子走完。(3) 4.排序重构问题。令A为一个由N个已特殊排序数组成的数列:A1,A2,AN,其中A1=0。令B为N(N-1)/2个数(定义为Dij=Ai-Aj(ij))组成的数列。例如,A=0,1,5,8,那么D=1,3,4,5,7,8。请完成:a) 编写程序,根据A构造D;编写程序,构造与D相对应的某一个数列A,注意A不是唯一的。1)编译的语言:C语言2)编译环境:Visual C+ 6.0关键词:递归,链表,栈和队列,猴子吃桃,跳马,排序重构 C语言 数据结构 顺序表 链表 数

4、组一求素数问题埃拉托色尼筛法(Sieve of Eratosthenes)是一种用来求所有小于N的素数的方法。从建立一个整数2N的表着手,寻找i的整数,编程实现此算法,并讨论运算时间。(1)1.数据结构设计定义一个线性表顺序存储结构,用来求所有小于N的素数typedef int DataType;/数据类型typedef structDataType datamaxsize; 定义一个一维数组int length;/线性表中实际元素的个数Seqlist;2.算法设计用一个循环结构判断是否为素数,如果是素数则返回1,负责返回0。int sushu(DataType &i) int m;if(i=

5、1) return 0;/不是素数for(m=2;mi;m+) if(i%m=0) return 0;/不是素数 return 1;/判断为素数,返回为13.调试分析 断一个数是否为素数的问题,例如数字I,求解其2-i-1 求余数,若为0,则不是素数,相反为素数。时间复杂度的分析:算法的时间复杂度O(L.length-1)+O(m)。4.测试结果 图1 数问题截图 程序运行结果如图所示,当输入素数5时,显示出1-5之间的素数2,3,5.5.源程序(带注释)#include #include #define maxsize 200#define FALSE 0typedef int DataTy

6、pe;typedef struct DataType datamaxsize; int length;Seqlist;/结点结构 int sushu(DataType i) int m; if(i=1) return 0; for(m=2;mi;m+) if(i%m=0) return 0; return 1; int m; int j;int i= 0; int k=0; int main() Seqlist L; L.length=maxsize; for(j=2;jL.length ) return FALSE; printf(1至m之间的素数从小到大分别为:n); for(i=1;i=

7、m ;i+) L.datai-1=i; for(i=1;i=m;i+) if(sushu(L.datai-1) k+; printf(%dt,L.datai-1); /符号t的作用是横向制表。 printf(n总共%d个。n,k );return 0; 二构造可以使n个城市连接的最小生成树问题描述:给定一个地区的n个城市间的距离网,用Prim算法或Kruskal算法建立最小生成树,并计算得到的最小生成树的代价。(4)要求:1)城市间的距离网采用邻接矩阵表示,邻接矩阵的存储结构定义采用课本中给出的定义,若两个城市之间不存在道路,则将相应边的权值设为自己定义的无穷大值.要求在屏幕上显示得到的最小生

8、成树中包括了哪些城市间的道路,并显示得到的最小生成树的代价。2)表示城市间距离网的邻接矩阵(要求至少6个城市,10条边);3)最小生成树中包括的边及其权值,并显示得到的最小生成树的代价。1.数据结构设计定义一个线性表顺序存储结构,用来求所有小于N的素数typedef int DataType;/数据类型typedef structDataType datamaxsize; 定义一个一维数组int length;/线性表中实际元素的个数Seqlist;2.算法设计克鲁斯卡尔算法的基本思想是:假设连通网=(V,E),则令最小生成树的初始状态为只有n 顶点而无边的非连通图T=(V, ),图中每个顶点

9、自成一个连通分量。在E中选择代价最小的边,若该边依附的顶点落在T中不同的连通分量上,则将此边加入到T中,否则舍去此边而选择下一条代价最小的边。依此类推,直至T中所有顶点都在同一个连通分量上为止。void Kruskal(graph *g ) int ans = 0,i,j,k = 0; /*ans用来记录生成最小树的权总值*/ int index; int count = 0; /*记录打印边的条数*/ for(i = 0;in);i +) /*初始化数组prex,rankx*/ set(i); for(i = 0;in);i +) for(j = i + 1;j n);j +) p+k.st

10、r = i; pk.end = j; pk.dis = g-adjij; /*先把所有城市之间的路段看成边*/ for(i=0;ik;i+) /*把所有的边按从小到大进行排序*/ index=i; for(j=i+1;j=k;j+) if(pj.dis pindex.dis) index=j; temp=pindex; pindex=pi; pi=temp; for(i = 0;i k;i +) if(find(pi.str) != find(pi.end)/*如果这两点连接在一起不构成一个回路,则执行下面操作*/ printf(t第%d条路段为:%d-%d,权值为%dn,+ count,pi

11、.str,pi.end,pi.dis);/*将这条边的起点、终点打印出来*/ ans += pi.dis; /*说明这条路段要用*/ Union(pi.str,pi.end); printf(t遍历所有城市得到最小生成树的代价为: %dnn,ans);3.调试分析 程序执行从主函数main()开始,首先在运行界面上显示菜单,调用菜单函menu( ),根据switch函数选择调用的函数,其中选择1,调用create()函数,用来创建城市之间距离的图,选择2,调用display()函数,用来显示最小生成树,而函数本身也存在函数的调用,在display()函数中调用 Kruskal()函数,该函数式

12、用克鲁斯卡尔算法求最小生成树,而Kruskal()函数中又调用三个函数set(),find(),Union(),它们作用是检验当一条边添加进去,是否会产生回路。算法的时间复杂度为O()4.测试结果示例如下: 图2,示例的图 图3,对应的最小生成树运行截图: 图4 邻接矩阵 图5 最小生成树5.源程序(带注释)#include #include #include #define max 20/城市间边数#define MAX_LNT 10 /城市数# define INF 32627 /两个城市间无直接路径,用大数32627表示typedef struct node /*构造一个结构体,两个城市

13、可以看成起点和终点,之间的道路可以看成一个边*/ int str; /*起点*/ int end; /*终点*/ int dis;/*距离*/node;node pmax,temp; /*p记录城市信息*/typedef struct /邻接矩阵存储图结构 int vexsMAX_LNT; /数组用于存储城市数 int adjmax+1max+1; /图的邻接矩阵表示 int n,e; /n代表城市数,e代表城市间边数graph;int pre100,rank100;/*用于判断是否构成回路*/int arcsMAX_LNTMAX_LNT;/*n表示城市个数,arcs记录城市间权值*/int

14、menu( ) /*菜单函数*/ int m; printf( 求最小生成树n); printf( _nn); printf( 1 输入城市之间的信息n); printf( 2 遍历所有城市生成最小生成树n); printf( 3 退出n); printf( _nn); printf( 请输入所选功能1-3:n); /system(color E);/*改变界面颜色的*/ scanf(%d,&m); return m;void create(graph *g) /*输入城市信息*/ int i,j,k; printf(输入城市数为:); scanf(%d,&(g-n); printf(n);

15、printf(输入个城市间边数为:); scanf(%d,&(g-e); printf(输入城市的各个顶点为:); for(i=0;in);i+) scanf(%d,&(g-vexsi); /顶点存入数组vexs printf(输入%d条边,建立邻接矩阵,(g-e); printf(n); for(i=0;in);i+) /初始化邻接矩阵 for(j=0;jn);j+) if(i=j) g-adjij=0; else g-adjij=INF; printf(请输入具有邻接关系的两个顶点在矩阵中所在的行与列及权值:n); for(k=0;ke);k+) /有g-e条边,即有g-e个权值 scan

16、f(%d,%d,&i,&j); scanf(%d,&g-adjij); for(i=0;in);i+) for(j=0;jn);j+) g-adjji=g-adjij; printf( 图的邻接矩阵如下n); for(i=0;in);i+) /输出邻接矩阵g for(j=0;jn);j+) if(g-adjij=INF) printf(t%3s,); else printf(t%3d,g-adjij); printf(n); /*下面三个函数作用是检验当一条边添加进去,是否会产生回路*/void set(int x)/*初始化*/ prex = x; rankx = 0;int find(in

17、t x)/*找到这个点的祖先*/ if(x != prex) prex = find(prex); return prex;void Union(int x,int y)/*将这两个添加到一个集合里去*/ x = find(x); y = find(y); if(rankx = ranky) prey = x; rankx +; else prey = x; void Kruskal(graph *g ) int ans = 0,i,j,k = 0; /*ans用来记录生成最小树的权总值*/ int index; int count = 0; /*记录打印边的条数*/ for(i = 0;in

18、);i +) /*初始化数组prex,rankx*/ set(i); for(i = 0;in);i +) for(j = i + 1;j n);j +) p+k.str = i; pk.end = j; pk.dis = g-adjij; /*先把所有城市之间的路段看成一个边*/ for(i=0;ik;i+) /*把所有的边按从小到大进行排序*/ index=i; for(j=i+1;j=k;j+) if(pj.dis pindex.dis) index=j; temp=pindex; pindex=pi; pi=temp; for(i = 0;i n)=0) printf(这里没有城市之间

19、的信息n); return; printf(遍历所有城市得到最小生成树为:nnn); Kruskal(g);int main( ) /*主函数*/ graph *g=(graph*)malloc(sizeof(graph);/这是给graph类变量*g分配一定的内存空间, 分配的空间大小等于结构体graph的大小 while(1) switch( menu( ) ) case 1:create(g);break;/*输入城市信息*/ case 2:display(g);break; /*显示生成的最小生成树*/ case 3:exit(0); return 0;三猴子吃桃问题有一群猴子摘了一堆

20、桃子,他们每天都吃当前桃子的一半且再多吃一个,到了第10天就只余下一个桃子。用多种方法实现求出原来这群猴子共摘了多少个桃子。1)采用数组数据结构实现上述求解2)采用链数据结构实现上述求解3)采用递归实现上述求解.数据结构设计1数组结构设计把猴子吃桃的天数倒过来看,以天数座位数组的下表i,剩下桃子的个数ai的递推公式为ai=(ai-1+1)*2。ai实际代表了倒数第i天剩下的桃子的个数。首先建立一个以天数为下标,以剩余桃子数为元素的数组,规定此数组的通项公式为ai=(ai-1+1)*2,最后输出第一天的桃子数。2链式存储结构建立一个链表,根据每天桃子数与后一天桃子数的关系:n=2*n+2,依次将

21、每天的桃子数存入链表中,最后输出第一天的桃子数。首先建立一个空的链表,产生一个头结点,并且将头结点的地址赋给某一参数,然后把每天的桃子数从链表的第一个结点插入链表。最后,第一天的桃子数被最后一个插入链表,成为链表的第一个值,将其赋值给另一个参数并输出,就可以得到第一天的桃子数。3递归算法递归算法的设计,利用公式n=2*n+2,定义一个函数ya3,并不断调用算法ya31,求出第一天的桃子数。2.算法设计数组数据结构实现:void ya1() int a11=0,0,0,0,0,0,0,0,0,0,0; a10=1;/构造数组 for(int i=10;i1;i-) ai-1=(ai+1)*2;/

22、数组的通项公式 cout共摘了a1个桃子.data=1; for(int i=10;i1;i-) x=(p-data+1)*2; ya *t; t=new ya; t-data=x; t-link=p; p=t; cout共摘了data个桃子。endl;递归算法:int ya31(int n)/递归实现; if(n=1) return 1; b=2*(ya31(n-1)+1); return b; void ya3() int x=1; x=ya31(10);/反复调用ya31方法实现递归算法 cout共摘了x个桃子。1;i-) ai-1=(ai+1)*2;/数组的通项公式 cout共摘了a1

23、个桃子.data=1; for(int i=10;i1;i-) x=(p-data+1)*2; ya *t; t=new ya; t-data=x; t-link=p; p=t; cout共摘了data个桃子。endl;递归算法:int ya31(int n)/递归实现; if(n=1) return 1; b=2*(ya31(n-1)+1); return b; void ya3() int x=1; x=ya31(10);/反复调用ya31方法实现递归算法 cout共摘了x个桃子。j))组成的数列。例如,A=0,1,5,8,那么D=1,3,4,5,7,8。请完成:编写程序,根据A构造D;编写程序,构造与D相对应的某一个数列A,注意A不是唯一的。具体要求是由题目给出的一个顺序序列按照题目给定的相关计算方法得到新的序列,然后对计算方法进行逆推得到新的顺序序列,由于计算方法我们得到的序列并不唯一1.数据结构设计数据结构:结构体。typedef struct int dataMAX; /一维数组 int flagMAX; /表示判断的变量 int size;

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1