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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

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

数据结构课程设计报告Word格式文档下载.docx

1、本课程设计是以邻接矩阵作为图的存储结构,分别采用Prim和Kruskal算法求最小生成树。Kruskal算法和Prim算法是求最小生成树的常用算法它们分别适用于稠密图和稀疏图。最小生成树的应用非常的广,如矿井通风设计和改造最优化方面以及如何搭建最短的网络线缆,构建造价最低的通讯网络。一、引言本课程设计我们要解决的问题是图最小生成树问题。要用到图的先相关数据结构和求最小生成树的两种数据结构算法普里姆算法和克鲁斯卡尔算法,以及储存图的边和点的邻接矩阵。本课程设计要解决的问题构造连通网的最小生成树,我们首先要做的是创建一个邻接矩阵,用以来存储图,然后我们要想好怎样利用普里姆算法和克鲁斯卡尔算法来构造

2、最小生成树。把这两种算法写入主函数,调试好程序。最后写好报告。二、设计题目1.问题描述若要在n个城市之间建设通信网络,只需要假设n-1条线路即可。如何以最低的经济代价建设这个通信网,是一个网的最小生成树问题。2.系统要求利用克鲁斯卡尔算法求网的最小生成树。利用普里姆算法求网的最小生成树。要求输出各条边及它们的权值。3.测试数据4.实现提示通信线路一旦建成,必然是双向的。因此,构造最小生成树的网一定是无向图。设图的顶点数不超过30个,并为简单起见,网中边的权值设成小于100的整数,100则表示没有路径。5.参考文献1严蔚敏.数据结构(C语言版)M.北京:清华大学出版社,1997.2谭浩强.C程序

3、设计(第三版)M.清华大学出版社,2005.1.3二霍红卫算法设计与分析西安西安电子科技大学出版社,2005.113-127.4陈杰.计算机专业课程设计中的需求分析J.集美大学学报,2009,10(2):8992.5高一凡.数据结构算法实现及解析M.西安:西安电子科技大学出版社,20026.运行环境VC+6.0三、需求分析此问题的关键在于如何实现PRIM算法和Kruskal算法,实现的过程中如何得到构成最小生成树的所有顶点,此外输出也是一个关键问题所在,在此过程中经过了多次调试。将图中的所有顶点存储到一个一维数组中,通过一个二维数组用邻接矩阵连实现对各边权值的存储首先我们对prim算法的问题进

4、行大致的概要分析:假设N=(V,E)是连通网,TE是N上最小生成树中边的集合。算法从U=u0(u0V),TE=开始,重复执行下述操作:在所有uU,vV-U的边(u,v)E中找一条代价最小的边(u0,v0)并入集合TE,同时v0并入U,直至U=V为止。此时TE中必有n-1条边,则T=(V,TE)为N的最小生成树。克鲁斯卡尔算法从另一种途径求网的最小生成树:假设连通网N=(V,E),则另最小生成树的初始状态为只有n个顶点而无边的非连通图T=(V,),图中每个顶点自成一个连通分量。在E中选择代价最小的边若该边依附的顶点落在T中不同的连通分量上,则将此边加入到T中,否则舍去此边而选择下一条代价最小的边

5、。以此类推直至T中的所有顶点都在同一连通分量上为止。对于prim算法从图的点集中任取一个顶点作为起始顶点,然后找到依附于该顶点的所有边选取权值最小的,依次找下去直至图中所有顶点都在一个点集中为止。对于克鲁斯卡尔算法则通过对权值进行排序找出权值最小的顶点和边并把该边的顶点并入点集之中。通过访问数组来实现对最小生成树边和权值的输出。四、概要设计1、设定图的抽象数据类型:ADTGraph数据对象V:V是具有相同特性的数据元素的集合,称为点集.数据关系R:R=VRVR=(v,w)|v,w属于V,(v,w)表示v和w之间存在的路径基本操作P:CreatGraph(&G,V,VR)初始条件:V是图的顶点集

6、,VR是图中弧的集合.操作结果:按V和VR是定义构造图G.Sort(edge*,MGraph*)图G存在,各边权值已知;对权值进行排序;Find(int*,int)前者为已存在的集合,后者为集合中的元素;查找函数,确定后者所属子集;Swapn(edgeint,int)交换某两个边的权值;2.图的存储结构typedef struct int vexnum,arcnum;ALGraph;typedef struct /边的结构体定义 int begin,end; /边的开始和结束顶点 int cost; /权值EDGE; int edgesmaxmax;/ int n,e;MGraph;3.流程图

7、五、详细设计在该函数中有6个模块,分别是主函数模块、路径权值进行排序、交换顶点及权值模块、判断是否回环、prim算法的实现、Kruskal算法的实现。1.主函数模块 ALGraph G; MGraph G2; int v,i,j; char a; do system(cls); couta; switch(a) case 1: MiniSpanTree_Kruskal(G);system(pausebreak;2 coutG2.n; for(j=1;j=G2.n;j+) cout请输入第个顶点所有边的权值(100代表不连通): for(i=1;iedgesj.cost) Swapn(edges

8、,i,j);在图中找到权值最小的边3.交换顶点及权值void Swapn(EDGE *edges,int i,int j)/ 交换的两个顶点及权值 int temp; temp=edgesi.begin; edgesi.begin=edgesj.begin; edgesj.begin=temp; temp=edgesi.end; edgesi.end=edgesj.end; edgesj.end=temp; temp=edgesi.cost; edgesi.cost=edgesj.cost; edgesj.cost=temp;该模块主要用于Kruskal算法,找到图中权值最小的一条边,然后交换

9、它们的顶点和权值。4.判断是否回环int Find(int *parents,int f)/判断是否形成环 while(parentsf)0&(f!=parentsf) f=parentsf; return f;在Kruskal算法中初始parents为0来设置访问未访问标志,以此来判断图是否成环。5.prim算法的实现void MiniSpanTree_PRTM(MGraph &G,int v) int closedgemax; int lowcostmax; int i,j,k,min;=G.n; lowcosti=G.edgesvi; closedgei=v; G.n; min=INF;

10、 for(j=1; if(lowcostj!=0&lowcostjmin) min=lowcostj; k=j; printf(边(%d,%d)权为:%dn,closedgek,k,min); lowcostk=0; if(G.edgeskj!G.edgeskjlowcostj) lowcostj=G.edgeskj; closedgej=k;6.Kruskal算法的实现void MiniSpanTree_Kruskal(ALGraph &G)/MiniSpanTree_Kruskal()函数实现 int i,s,v1,v2,value,bnf,edf; int parentsMAX_VERT

11、EX_NUM; EDGE edgesMAX_VERTEX_NUM;endlG.vexnum; /输入顶点数请输入边数:G.arcnum; /输入边数请输入(V1和V2), 例如: (V1=1,V2=3),(V1=2,V2=4).endl; /输入arc(v1,v2)+i)请输入第 条边的第一个顶点:v1; /输入头顶点条边的第二个顶点:v2; /输入尾顶点条边的权值 :value; /输入边的权值 edgesi.begin=v1; edgesi.end=v2; while(v1G.vexnum|v2G.vexnum) /如果输入的非法,重新输入输入不合法,请重新输入! edgesi.begin

12、=v1; edgesi.end=v2; edgesi.cost=value; Sort(edges,G); /调用Sort()函数按照排列好的序列逐个输出权值edgesi.costt=G.vexnum; parentsi=0; /初始化array parents最小生成树为: for(i=1,s=1;s=G.vexnum& bnf=Find(parents,edgesi.begin); edf=Find(parents,edgesi.end); if(bnf!=edf) parentsbnf=edf;edgesi.begin- /输出最小生成树edgesi.end的边为:edgesi.cost

13、; s+; 六、调试与分析测试数据如下图求该图的最小生成树1.进入主页面2.利用克鲁斯卡尔算法求最小生成树选择序号1使用克鲁斯卡尔算法求图的最小生成树。输入每条边的顶点和权值对权值进行排序,并且输出最小生成树。3.利用prim算法求最小生成树选择序号2用prim算法求最小生成树。通过一个n阶的邻接矩阵来实现图的输入输入起始顶点然后输出最小生成树的各边及其每一条边的权值。4.退出程序选择序号3退出程序七、测试结果克鲁斯卡尔算法求得的最小生成树为352146Prim算法求得的最小生成树为125346八、设计心得体会在我的努力下,课程设计终于完成,由于我们对数据结构和c语言不是很了解,有时忽略了一些

14、关键的细节,使得在编写程序的过程中出现了一些问题。对于打字有时粗心导致出现一些难以发现的小错误,在我的耐心,细致的调试下最终使得程序能够运行,课程设计圆满完工。问题一:求出图中的最小值现象:求出的最小值是0原因:图中没有连通的两个顶点之间的权值赋值为0问题二:求最小生成树时,else语句需再调用一个函数对某些二叉树能求出最小生成树,但不能普遍适应对于找最小生成树边的各种可能没有考虑全面,代码才没有广泛的适应性问题三:两个顶点之间的边是否是最小生成树的边代码的功能不能分辨出是否是最小生成树的边把简单的代码写的很复杂,从而杂乱无章出现错误。在课设过程中,遇到许多问题,通过查阅资料和课本。是我对数据

15、结构有了更进一步的认识。当然,这中间也有其他人的帮助。我的同学,以及指导老师都给我提出了非常宝贵的意见。通过与同学和老师的交流,使我找到了数据结构这门课程的学习方法。但是,我感觉这不仅仅是数据结构的学习方法,他或许就是学习软件工程这门专业的方法,那就是多动手。的确如此,对于一个算法,你知道它的算法思想和用计算机实现它却是另外一回事。这门课程,不仅需要我们用心去理解每一种算法的思想,更需要我们去动手来实现它。附录(源代码)#include iostreamusing namespace std;#define MAX_VERTEX_NUM 30 /定义最大顶点数#define MAXQSIZE 100#define max 20#define INF 10/void Swapn(EDGE *edges,int i,int j); / 交换的两个顶点及权值void Sort(EDGE *edges,ALGraph G); /对带权路径从小到大排序int Find(int *parents,int f); /判断是否形成环G); /MiniSpanTree_Kruskal()函数实现/G.n

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

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