数据结构课程设计报告.doc
- 文档编号:251340
- 上传时间:2022-10-07
- 格式:DOC
- 页数:22
- 大小:184.04KB
数据结构课程设计报告.doc
《数据结构课程设计报告.doc》由会员分享,可在线阅读,更多相关《数据结构课程设计报告.doc(22页珍藏版)》请在冰豆网上搜索。
课程设计报告
题目:
在n个城市之间建设网络,只需保证连通即可,求最经济的架设方法。
存储结构采用(邻接表和邻接矩阵)两种,采用课本上的两种求解算法。
一、需求分析
1.1已知一个无向连通网表示n个城市以及城市间可能设置的通信网络线路,其中网的顶点表示城市,边表示两个城市之间的线路,赋于边上的权值表示相应的代价。
对于n个点的连通网能建立许多不同的生成树,每一棵生成树都可以是一个通信网。
我们要选择一棵生成树,使总的耗费最小。
1.2该无向连通图的建立需要使用两种存储结构,即邻接表和邻接矩阵。
1.3实现最小生成树需要使用两种算法。
即普里姆算法和克鲁斯卡尔。
1.4程序通过人机交互实现数据的输入和输出。
1.5测试数据
(a,b):
2;(a,c):
3;(a,d):
4;(c,d):
4;(b,d):
5
二、概要设计
程序分为两大部分存储部分和算法部分;存储部分分为邻接矩阵和邻接表,而且包含了两者直接的互相转换;算法部分分为普里母算法和克鲁斯卡尔算法。
1.抽象数据类型图的定义如下
ADTGraph{
数据对象V;V是具有相同特性的数据元素的集合,成为顶点集。
数据关系R:
R={VR}
VR={(v,w)|v,w为V集合中的元素,(v,w)表示v和w之间存在的路径}
基本操作P;
CreateMGraph(MGraph*G)
初始条件:
V是图的顶点集,VR是图的边的集合。
操作结果:
按V和VR的定义构造图G,用邻接矩阵存储。
CreateALGraph(ALGraph*G)
初始条件:
V是图的顶点集,VR是图的边的集合。
操作结果:
按V和VR的定义构造图G,用邻接表存储。
LocateVex(G,u)
初始条件:
图G存在,u和G中顶点有相同的特征。
操作结果:
若G中存在顶点u,则返回该顶点在图中的位置;否则返回其他信息。
MiniSpanTree_PRIM(G,u)
初始条件:
图G存在,u是图G中的一个顶点。
操作结果:
用普利姆算法从第u个顶点出发构造网G的最小生成树T,输出T的各条边。
Kriuskal(G)
初始条件:
图G存在
操作结果:
用克鲁斯卡尔算法构造图G的最小生成树T,输出T的各条边。
ListToMat(MGraph*G1,ALGraph*G2)
初始条件:
图G2存在
操作结果:
把图的邻接表存储结构转换为邻接矩阵存储结构,用图G1表示。
MatToList(MGraph*G1,ALGraph*G2)
初始条件:
图G1存在
操作结果:
把图的邻接矩阵存储结构转换为邻接表存储结构,用图G2表示。
LocateVex(MGraph*G,VertexTypeu)
初始条件:
图G存在,u和G中顶点有相同特征
操作结果:
若G中存在顶点u,则返回该顶点在图中位置;否则返回-1
}ADTGraph
2.主程序
voidmain()
{
创建图G,并按不同的存储结构输出。
对图的存储结构进行转换
使用算法构造最小生成树并输出各边
}
3.模块间的调用关系
主模块
子模块
三、详细设计
1.图和顶点的定义
#defineOK1
#defineERROR0
#defineTURE1
#defineFALSE0
#defineOVERFLOW-1
#defineINFEASIBLE-2
typedefintStatus;
#defineINFINITY32767//两地之间没有架设线路的权值为最大数。
#defineMAX_VERTEX_NUM20//城市的数目最大为20
#defineMAX_NAME5//城市名称的最大长度为5
typedefcharVertexType[MAX_NAME];//城市的名称用字符数组存储
typedefintVRType;//两城市间的关系类型
1.1邻接矩阵存储表示的图的结构体类型的定义
typedefstructArcCell
{
VRTypeadj;
/*顶点关系类型。
对无权图,用1(是)或0(否)表示相邻否*/
/*对带权全图,则为权值类型*/
}ArcCell,AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
typedefstruct
{
VertexTypevexs[MAX_VERTEX_NUM];/*顶点向量*/
AdjMatrixarcs;/*邻接矩阵*/
intvexnum,arcnum;/*图的当前顶点数和弧数*/
}MGraph;
1.2邻接表类型存储表示的图的结构体类型的定义
typedefstructANode/*弧的结点结构类型*/
{intend;//弧尾在邻接表头结点中的位置
intbegin;//弧头在邻接表头结点中的位置
intweight;/*该弧的相关信息,这里用于存放权值*/
structANode*nextarc;/*指向下一条弧的指针*/
}ANode;
typedefstructVnode/*邻接表头结点的类型*/
{VertexTypevertex;/*顶点信息,城市名称*/
intbianhao;//城市在邻接表头结点数组中的相应编号
ANode*firstarc;/*指向第一条弧*/
}VNode,AdjList[MAX_VERTEX_NUM];/*AdjList是邻接表类型*/
typedefstruct
{AdjListadjlist;/*邻接表*/
intvexnum,arcnum;/*图中顶点数n和边数e*/
}ALGraph;
2.Prim算法的思想
假设V是图中顶点的集合,E是图中边的集合,TE为最小生成树中的边的集合,则prim算法通过以下步骤可以得到最小生成树:
(1)初始化:
U={u0},TE={f}。
此步骤设立一个只有结点u0的结点集U和一个空的边集TE作为最小生成树的初始形态,在随后的算法执行中,这个形态会不断的发生变化,直到得到最小生成树为止。
(2)在所有u∈U,v∈V-U的边(u,v)∈E中,找一条权最小的边(u0,v0),将此边加进集合TE中,并将此边的非U中顶点加入U中。
此步骤的功能是在边集E中找一条边,要求这条边满足以下条件:
首先边的两个顶点要分别在顶点集合U和V-U中,其次边的权要最小。
找到这条边以后,把这条边放到边集TE中,并把这条边上不在U中的那个顶点加入到U中。
这一步骤在算法中应执行多次,每执行一次,集合TE和U都将发生变化,分别增加一条边和一个顶点,因此,TE和U是两个动态的集合,这一点在理解算法时要密切注意。
(3)如果U=V,则算法结束;否则重复步骤2。
可以把本步骤看成循环终止条件。
我们可以算出当U=V时,步骤2共执行了n-1次(设n为图中顶点的数目),TE中也增加了n-1条边,这n-1条边就是需要求出的最小生成树的边。
Prim算法假设网中有N个顶点,则第一个进行初始化的循环语句频度为n,第二个循环语句的频度为n-1。
其中有两个内循环;由此普里母算法的时间复杂度为O(n2),与网中的边数无关!
3.克鲁斯卡尔算法的思想为
假设WN=(V,{E})是一个含有n个顶点的连通网,则按照克鲁斯卡尔算法构造最小生成树的过程为:
(1)先构造一个只含n个顶点,而边集为空的子图,若将该子图中各个顶点看成是各棵树上的根结点,则它是一个含有n棵树的一个森林。
(2)从网的边集E中选取一条权值最小的边,若该条边的两个顶点分属不同的树,则将其加入子图,也就是说,将这两个顶点分别所在的两棵树合成一棵树;反之,若该条边的两个顶点已落在同一棵树上,则不可取,而应该取下一条权值最小的边再试之。
(3)依次类推,重复上述操作,直至森林中只有一棵树,也即子图中含有n-1条边为止。
克鲁斯卡尔算法至多对e条边各扫描一次时间复杂度为O(eloge)。
4.编写程序使用到的函数为
(a)程序中用来实现邻接矩阵和邻接表存储、输出以及互相转化的函数
StatusInitALGraph(ALGraph*G)
//初始化邻接表
voidCreateALGraph(ALGraph*G)
//创建邻接表
StatusInitMGraph(MGraph*G)
//初始化邻接表
StatusCreateMGraph(MGraph*G)
//创建邻接表
StatusMatToList(MGraph*G1,ALGraph*G2)
//将邻接矩阵G1转换成邻接表G2
StatusListToMat(MGraph*G1,ALGraph*G2)
//将邻接表G1转换成邻接矩阵G2
StatusPrintMGraph(MGraph*G)
//输出邻接矩阵g
StatusPrintALGraph(ALGraph*G){
//输出邻接表G
(b)程序中用来完成prim和kriuskal算法的函数
intmininum(minsideclosedge,MGraph*G)
//求closedege数组中lowcost的最小正值
voidMiniSpanTree_PRIM(MGraph*G,VertexTypeu)
//用普利姆算法从第u个顶点出发构造网G的最小生成树T,输出T的各条边voidInsertSort(EdgeTypeE[],intn)
//对E[0...n-1]按权值递增有序的进行直接插入排序
voidKriuskal(ALGraph*G)
//克鲁斯卡尔算法
(c)查找顶点U在图中的位置
intLocateVex(MGraph*G,VertexTypeu)
//查找顶点U在图中的位置
5.主函数模块为:
voidmain()
{
定义邻接矩阵存储结构的图;
定义邻接表存储结构的图;
选择一种存储结构画出图,并输出;
邻接矩阵和邻接表相互转化,得到两种类型的存储图,并输出转换后的图;
选择一种算法得到最小生成树并输出生成树的各边。
}
6.模块间的调用层次
main()
voidCreateALGraph(ALGraph*G)
StatusCreateMGraph(MGraph*G)
StatusMatToList(MGraph*G1,ALGraph*G2)
StatusListToMat(MGraph*G1,ALGraph*G2)
voidMiniSpanTree_PRIM(MGraph*G,VertexTypeu)
voidKriuskal(ALGraph*G)
StatusInitALGraph(ALGraph*G)
StatusInitMGraph(MGraph*G)
StatusPrintMGraph(MGraph*G)
StatusPrintALGraph(ALGraph*G)
intmininum(minsideclosedge,MGraph*G)
v
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 课程设计 报告
![提示](https://static.bdocx.com/images/bang_tan.gif)