- 1、本文档共17页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
沈阳航空航天大学
课程设计报告
课程设计名称:数据结构课程设计
课程设计题目:最小生成树Kruskal算法
院〔系〕:计算机学院
专业:计算机科学与技术
目录
TOC\o"1-3"\h\z\u1课程设计介绍1
1.1课程设计内容1
1.2课程设计要求1
2课程设计原理2
2.1课设题目粗略分析2
2.2原理图介绍3
2.2.1功能模块图3
2.2.2流程图分析3
3数据结构分析9
3.1存储结构9
3.2算法描述9
4调试与分析11
4.1调试过程11
程序执行过程11
参考文献13
附录〔关键局部程序清单〕14
1课程设计介绍
1.1课程设计内容
设计程序,编写算法能建立带权图,并能够用Kruskal算法求该图的最小生成树,系统主要功能如下:
最小生成树能够选择图上的任意一顶点做根结点;
最小生成树输出不必采用图形方式,可按父结点和子女结点集的形式输出。
1.2课程设计要求
顶点信息用字符串,数据可自行设定;
参考相应的资料,独立完成课程设计任务;
交标准课程设计报告和软件代码。
2课程设计原理
2.1课设题目粗略分析
根据课设题目要求,拟将整体程序分为五大模块。此五个模块相互联系,有嵌套调用的情况,以下是五个模块的大体分析:
创立模块,建立无向连通图,创立图的总信息;
发现模块,用Kruscal算法求最小生成树并调用search()函数;
寻找模块,找出最小边(路径),使各连通分量相统一,输出最小生成树对应边及对应结点并调用change()函数;
改变模块,改变两个结点间的权值,使下一次寻找时不至于重复;
选择模块,选择最小生成树的根结点并按父亲节点和子女结点的形式输出最小生成树。
2.2原理图介绍
2.2.1功能模块图
最小生成树
最小生成树Kruskal算法
选择模块
改变模块
寻找模块
发现模块
创立模块
图功能模块图
2.2.2流程图分析
创立模块,建立无向连通图,创立图的总信息,流程图如下:
图2.2创立块流程图
发现模块,用Kruscal算法求最小生成树并调用search()函数,流程
图如下:
图2.3发现模块流程图
寻找模块,找出最小边(路径),使各连通分量相统一,输出最小生成树对应边及对应结点并调用change()函数,具体流程图如下:
图2.4寻找模块流程图
图2.5寻找模块流程图
改变模块,改变两个结点间的权值,使下一次寻找时不至于重复,具体流程图如下:
图2.6改变模块流程图
选择模块,选择最小生成树的根结点并按父亲节点和子女结点的形式输出最小生成树法,具体流程图如下:
图2.7选择模块流程图
3数据结构分析
3.1存储结构
定义结构体数组建立整个图的信息,包括图的各个结点的名称及对应的数字编号,连接两结点的边的权值,建立存在互相连通的两结点之间的联系且采用从头插入的链表连接方式,并且每个结点建立对应的邻接表,都采用头插入的方式,相互连接的两结点都存有对应的边的权值,存储代码如下:
typedefstructlink
{
intconnect;//结点编号
intfee;//权值
structlink*next;
}edgenode;
typedefstructnode
{
charname[10];//结点名称
edgenode*link;
}jiedian;
typedefstruct
{
jiedianvex[MAXSIZE];
intjiedian_n,jiedian_e;//结点个数,边数(路径数)
}jiedian_graph;
3.2算法描述
1.建立两结点间联系,采用从头插入的方式,其中p,q分别为两项链结点的编号,简单算法说明如下:
p->next=ga->vex[a].link;//建立两个结点间的联系
ga->vex[a].link=p;
q->next=ga->vex[b].link;
ga->vex[b].link=q;
2.寻找所建图中最小权值所在边对应的两个结点,如果寻找过那么重新标记为一个统一的更大权值,以防止下次寻找时影响寻找的结果,简单算法说明如下:
for(j=1;j<ga->jiedian_n+1;j++)//找权值最少的两个结点
{
p=ga->vex[j].link;
//记下当前结点,以便在此结点的联系链中找到此链下的最小权值边(路径)
while(p!=NULL)
{
if((p->fee<min)&&(p->fe
文档评论(0)