数据结构课程设计七

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

数据结构课程设计七

班级:06计本(1) 姓名:魏建平学号:20060724035

题目:严慰敏习题实习五第6题,求图的最小生成树问题:若要在n个城市之间建设通信网络,只需要架设n-1条线路即可。如何以最低的经济代价建设这个通信网,是一个最小生成树问题。

一、需求分析

1、利用克鲁斯算法求网的最小生成树,实现抽象数据类型MFSet,以此表示构造生成树

过程中的连通分量。

2、以文本形式输出生成树中各条边以及他们的权植。

3、用邻接矩阵表示法的形式建立图的存储结构。它采用两个数组来表示图:一个用来

存放图的顶点名字,另一个用来存储图中顶点之间关联关系的二维数组。

4、演示程序以用户和计算机的对话框执行,根据对话框所显示的内容,进行输入。最后进行

核对。

5、测试数据:

二、概要设计

1、抽象数据类型图的定义:

ADT Graph

数据对象V :—个集合,该集合中的所有元素具有相同的特性。数据关系R: R={VR}

VR={< x, y> | P(x,y ) n (x ,y € V) }

基本操作:

1): CreateGraph(G):

初始条件:图G存在。

操作结果:创建图G

2):DestoryGraph(G):

初始条件:图G存在。

操作结果:销毁图G

3):LocateVertex(G,v): 初始条件:图G 存在。

操作结果:确定顶点v在图G中的位置。若图G中没有顶点v,则函数值为空。

4):GetVertex(G,i):

初始条件:图G存在。

操作结果:取出图G的第i个顶点的值。若i大于图G的顶点数,则函数值为空。

5):FirstAdjVertex(G,v):

初始条件:图G存在。

操作结果:求图G中顶点n的第一个邻接点。若v无邻接点或图G中无顶点v,则函数值为空。6):NextAdjVertex(G,v,w):

初始条件:图G存在。

操作结果:一直w是图G中顶点v的某个邻接点,求顶点v的下一个邻接点(紧跟这w后面)。若w是v的最后一个邻接点,则函数值为空。

7):InsertVertex(G,u):

初始条件:图G存在。

操作结果:在图G中增加一个顶点u。

8):DeleteVertex(G,u):

初始条件:图G存在。

操作结果:删除图G的顶点v及其顶点v相关联的弧。

9):InsertArc(G,v,w):

初始条件:图G存在。

操作结果:在图G着那个增加一条从顶点v到顶点w的弧。

10):DeleteArc(G,v,w):

初始条件:图G存在。

操作结果:删除图G中从顶点v到顶点w的弧。

11):TraverGraph(G):

初始条件:图G存在。操作结果:按照某种次序,对图G的每个结点访问一次且仅访问一次。

2、主程序:

Void main()

{

接受命令(提示用户输入图的点数和边数) ;接受命令(提示用户输入各个顶点的值) ;接受命令(提示用户输入每条边的起点和终点及权值) ;输入结果;

3、本程序只有三个模块,调用简单:

上函数模块

矩阵模块图模块

三、详细设计

1、图及邻接矩阵结构定义:

#define MAX_NAME 5

#define MAX_VERTEX_NUM 20

typedef char Vertex[MAX_NAME];〃顶点名字串

邻接矩阵typedef int AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];〃struct

MGraph/* 定义图*/

{

Vertex vexs[MAX_VERTEX_NUM];

AdjMatrix arcs;

int vex nu m,arc num;

};

typedef struct

{

Vertex adjvex; /* 当前点*/

int lowcost;

}mi nside[MAX_VERTEX_NUM];

2、图定位函数:

int LocateVex(MGraph G ,Vertex u)// 定位

{

int i;

for(i=0;i<G .vexnum;++i)

if(strcmp(u,G .vexs[i])==0)

return i;

return -1;

}

3、图创建函数:

void CreateGraph(MGraph &G)

{

int i,j,k,w;

Vertex va,vb;

cout<<"请输入无向带权图G的点数和边数(以空格为分隔)

cin>>G.vexnum»G .arcnum;

cin>>G.vexnum;

for(i=0;i<G .vexnum;++i) /* 构造顶点集*/ scanf("%s",G .vexs[i]);

for(i=0;i<G .vexnum;++i) /* 初始化邻接矩阵*/ for(j=0;j<G .vexnum;++j)

G.arcs[i][j]=0x7fffffff;

cout<<" 请输入图的每条边的起点和终点,以及权值

:"<<endl;

cin>>G.arcnum;

for(k=0;k<G .arcnum;++k)

{ scanf("%s%s%d%*c",va,vb,&w); i=LocateVex(G ,va); j=LocateVex(G ,vb);

G.arcs[i][j]=G .arcs[j][i]=w; /* 对称*/

}

}

4、求最小生成树函数:void kruskal(MGraph G)

{

int set[MAX_VERTEX_NUM],i,j;

int k=0,a=0,b=0,min=G .arcs[a][b]; for(i=0;i<G .vexnum;i++)

set[i]=i;

cout<<" 图的最小生成树为:"<<endl;

while(k<G .vexnum-1)

{

for(i=0;i<G .vexnum;++i) for(j=i+1;j<G .vexnum;++j) if(G.arcs[i][j]<min) { min=G.arcs[i][j]; a=i; b=j;

} min=G.arcs[a][b]=0x7fffffff; if(set[a]!=set[b])

{

printf("%s-%s\n",G .vexs[a],G.vexs[b]); k++;

for(i=0;i<G .vexnum;i++) if(set[i]==set[b]) set[i]=set[a];

}

}

5、主函数:

void mai n()

{

MGraph g;

CreateGraph(g);

kruskal(g);

}

四、调试分析

1、求图的最小生成树的问题是一个很有意义,也很有挑战的问题,如果能对任意图求

出其最小生成树,那么这将成为一个很有商业价值的产品。

2、求最小生成树除了克鲁斯算法还有普里姆算法,我们应该综合使用两种方法,比较

其执行效率,然后选择较优的方法。本程序只使用了一各种方法,程序不够完美。

3、由于克鲁斯算法思想书上已经给出,所以这个题目并不难做。

五、用户手册

1、本程序的运行环境为DOS操作环境,文件名为5_6.exe;

2、本例演示程序简单明了,按程序提示操作即可。

相关文档
最新文档