数据结构课程设计报告7046135.docx

上传人:b****3 文档编号:1484992 上传时间:2022-10-22 格式:DOCX 页数:21 大小:327.60KB
下载 相关 举报
数据结构课程设计报告7046135.docx_第1页
第1页 / 共21页
数据结构课程设计报告7046135.docx_第2页
第2页 / 共21页
数据结构课程设计报告7046135.docx_第3页
第3页 / 共21页
数据结构课程设计报告7046135.docx_第4页
第4页 / 共21页
数据结构课程设计报告7046135.docx_第5页
第5页 / 共21页
点击查看更多>>
下载资源
资源描述

数据结构课程设计报告7046135.docx

《数据结构课程设计报告7046135.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计报告7046135.docx(21页珍藏版)》请在冰豆网上搜索。

数据结构课程设计报告7046135.docx

数据结构课程设计报告数据结构课程设计报告7046135(此文档为word格式,下载后您可任意编辑修改!

)数据结构课程设计报告院系:

计算机学院班级:

软件121班姓名:

程猛学号:

题目:

最小生成树指导老师:

杜献峰一、引言3二、设计题目31.问题描述32.系统要求33.测试数据44.实现提示45.参考文献46.运行环境5三、需求分析51.如何选择存储结构去建立一个带权网络。

52.如何在所选存储结构下输出这个带权网络。

53.如何实现PRIM算法和Kruskal算法的功能。

54.如何从每个顶点开始找到所有的最小生成树的顶点。

65.如何输出最小生成树的边及其权值。

6四、概要设计62.图的存储结构73.流程图7五、详细设计81.主函数模块82.对路径权值进行排序9六、调试与分析13七、测试结果16八、设计心得体会16附录(源代码)17摘要最小生成树是数据结构中图的一种重要应用,在图中对于n个顶点的连通网可以建立许多不同的生成树,最小生成树就是在所有生成树中总的代价最小的生成树。

本课程设计是以邻接矩阵作为图的存储结构,分别采用Prim和Kruskal算法求最小生成树。

Kruskal算法和Prim算法是求最小生成树的常用算法它们分别适用于稠密图和稀疏图。

最小生成树的应用非常的广,如矿井通风设计和改造最优化方面以及如何搭建最短的网络线缆,构建造价最低的通讯网络。

一、引言一、引言本课程设计我们要解决的问题是图最小生成树问题。

要用到图的先相关数据结构和求最小生成树的两种数据结构算法普里姆算法和克鲁斯卡尔算法,以及储存图的边和点的邻接矩阵。

本课程设计要解决的问题构造连通网的最小生成树,我们首先要做的是创建一个邻接矩阵,用以来存储图,然后我们要想好怎样利用普里姆算法和克鲁斯卡尔算法来构造最小生成树。

把这两种算法写入主函数,调试好程序。

最后写好报告。

二、设计题目二、设计题目1.问题描述问题描述若要在n个城市之间建设通信网络,只需要假设n-1条线路即可。

如何以最低的经济代价建设这个通信网,是一个网的最小生成树问题。

2.系统要求系统要求利用克鲁斯卡尔算法求网的最小生成树。

利用普里姆算法求网的最小生成树。

要求输出各条边及它们的权值。

3.测试数据测试数据4.实现提示实现提示通信线路一旦建成,必然是双向的。

因此,构造最小生成树的网一定是无向图。

设图的顶点数不超过30个,并为简单起见,网中边的权值设成小于100的整数,100则表示没有路径。

5.参考文献参考文献1严蔚敏.数据结构(C语言版)M.北京:

清华大学出版社,1997.2谭浩强.C程序设计(第三版)M.北京:

清华大学出版社,2005.1.3二霍红卫算法设计与分析西安西安电子科技大学出版社,2005.4陈杰.计算机专业课程设计中的需求分析J.集美大学学报,2009,10

(2):

8992.5高一凡.数据结构算法实现及解析M.西安:

西安电子科技大学出版社,20026.运行环境运行环境VC+6.0三、需求分析三、需求分析1.如何选择存储结构去建立一个带权网络。

如何选择存储结构去建立一个带权网络。

此问题的关键在于如何实现PRIM算法和Kruskal算法,实现的过程中如何得到构成最小生成树的所有顶点,此外输出也是一个关键问题所在,在此过程中经过了多次调试。

2.如何在所选存储结构下输出这个带权网络。

如何在所选存储结构下输出这个带权网络。

将图中的所有顶点存储到一个一维数组中,通过一个二维数组用邻接矩阵连实现对各边权值的存储3.如何实现如何实现PRIM算法和算法和Kruskal算法的功能。

算法的功能。

首先我们对prim算法的问题进行大致的概要分析:

假设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中,否则舍去此边而选择下一条代价最小的边。

以此类推直至T中的所有顶点都在同一连通分量上为止。

4.如何从每个顶点开始找到所有的最小生成树的顶点。

如何从每个顶点开始找到所有的最小生成树的顶点。

对于prim算法从图的点集中任取一个顶点作为起始顶点,然后找到依附于该顶点的所有边选取权值最小的,依次找下去直至图中所有顶点都在一个点集中为止。

对于克鲁斯卡尔算法则通过对权值进行排序找出权值最小的顶点和边并把该边的顶点并入点集之中。

5.如何输出最小生成树的边及其权值。

如何输出最小生成树的边及其权值。

通过访问数组来实现对最小生成树边和权值的输出。

四、概要设计四、概要设计1、设定图的抽象数据类型:

ADTGraph数据对象V:

V是具有相同特性的数据元素的集合,称为点集.数据关系R:

R=VRVR=(v,w)|v,w属于V,(v,w)表示v和w之间存在的路径基本操作P:

CreatGraph(&G,V,VR)初始条件:

V是图的顶点集,VR是图中弧的集合.操作结果:

按V和VR是定义构造图G.Sort(edge*,MGraph*)初始条件:

图G存在,各边权值已知;操作结果:

对权值进行排序;Find(int*,int)初始条件:

前者为已存在的集合,后者为集合中的元素;操作结果:

查找函数,确定后者所属子集;Swapn(edge*,int,int)初始条件:

图G存在,各边权值已知;操作结果:

交换某两个边的权值;2.图的存储结构图的存储结构typedefstructintvexnum,arcnum;ALGraph;typedefstruct/边的结构体定义intbegin,end;/边的开始和结束顶点intcost;/权值EDGE;typedefstructintedgesmaxmax;/intn,e;MGraph;3.流程图流程图五、详细设计五、详细设计在该函数中有6个模块,分别是主函数模块、路径权值进行排序、交换顶点及权值模块、判断是否回环、prim算法的实现、Kruskal算法的实现。

1.主函数模块主函数模块ALGraphG;MGraphG2;intv,i,j;chara;dosystem(cls);coutt*nn;coutt1克鲁斯卡尔n;coutt2普里姆n;coutt3退出nn;coutt*n;couta;switch(a)case1:

MiniSpanTree_Kruskal(G);system(pause);break;case2:

coutG2.n;for(j=1;j=G2.n;j+)cout请输入第j个顶点所有边的权值(100代表不连通):

;for(i=1;iG2.edgesji;coutv;MiniSpanTree_PRTM(G2,v);system(pause);break;default:

break;while(a!

=3);return0;该模块包含菜单的设计以及通过一个switch语句来实现对prim算法和Kruskal算法的实现。

进入主菜单后选择相应的序号执行相应的操作,每进行一步后,按任意键继续进行下一个操作可重复执行。

2.对路径权值进行排序对路径权值进行排序voidSort(EDGE*edges,ALGraphG)/对带权路径从小到大排序inti,j;for(i=1;i=G.arcnum;i+)for(j=i;jedgesj.cost)Swapn(edges,i,j);在图中找到权值最小的边3.交换顶点及权值voidSwapn(EDGE*edges,inti,intj)/交换的两个顶点及权值inttemp;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算法,找到图中权值最小的一条边,然后交换它们的顶点和权值。

4.判断是否回环intFind(int*parents,intf)/判断是否形成环while(parentsf)0&(f!

=parentsf)f=parentsf;returnf;在Kruskal算法中初始parents为0来设置访问未访问标志,以此来判断图是否成环。

5.prim算法的实现voidMiniSpanTree_PRTM(MGraph&G,intv)intclosedgemax;intlowcostmax;inti,j,k,min;for(i=1;i=G.n;i+)lowcosti=G.edgesvi;closedgei=v;for(i=1;iG.n;i+)min=INF;for(j=1;j=G.n;j+)if(lowcostj!

=0&lowcostjmin)min=lowcostj;k=j;printf(边(%d,%d)权为:

%dn,closedgek,k,min);lowcostk=0;for(j=1;j=G.n;j+)if(G.edgeskj!

=0&G.edgeskjlowcostj)lowcostj=G.edgeskj;closedgej=k;6.Kruskal算法的实现voidMiniSpanTree_Kruskal(ALGraph&G)/MiniSpanTree_Kruskal()函数实现inti,s,v1,v2,value,bnf,edf;intparentsMAX_VERTEX_NUM;EDGEedgesMAX_VERTEX_NUM;coutendlG.vexnum;/输入顶点数coutG.arcnum;/输入边数cout请输入(V1和V2),例如:

(V1=1,V2=3),(V1=2,V2=4).;coutendl;/输入arc(v1,v2)for(i=1;i=G.arcnum;+i)coutendl请输入第iv1;/输入头顶点cout请输入第iv2;/输入尾顶点cout请输入第ivalue;/输入边的权值edgesi.begin=v1;edgesi.end=v2;while(v1G.vexnum|v2G.vexnum)/如果输入的非法,重新输入cout输入不合法,请重新输入!

;coutendl请输入第iv1;cout请输入第iv2;cout请输入第ivalue;edgesi.begin=v1;edgesi.end=v2;edgesi.cost=value;Sort(edges,G);/调用Sort()函数cout按照排列好的序列逐个输出权值endl;for(i=1;i=G.arcnum;i+)coutedgesi.costt;for(i=1;i=G.vexnum;+i)parentsi=0;/初始化arrayparentscoutendl最小生成树为:

endl;for(i=1,s=1;s=G.vexnum&i=G.arcnum;i+)bnf=Find(parents,edgesi.begin);edf=Find(parents,edgesi.end);if(bnf!

=edf)parentsbnf=edf;coutendledgesi.begin-;/

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 解决方案 > 学习计划

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

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