好文档 - 专业文书写作范文服务资料分享网站

数据结构实验六 图结构及其应用

天下 分享 时间: 加入收藏 我要投稿 点赞

实验七 图结构及其应用

一、 实验目的

1. 掌握图类的邻接矩阵存储结构的实现; 2. 掌握图的基本操作,包括图的建立、广度优先遍历和深度优先遍历算法; 3. 掌握求最短路径的Dijkastra算法。

二、 实验要求

1. 复习课本中第7章关于图的相关知识内容; 2. 用C++语言完成算法和程序设计并且调试通过;

三、 实验题目与要求

1.图的遍历

详细描述:利用以提供的源程序素材,实现对不多于30个结点的图的建立以及广度优先和深度优先遍历算法。

具体功能要求:从键盘中输入网中顶点的个数,以及顶点的数据值,并以顶点的输入次序作为顶点的编号输入顶点与顶点之间的邻接边的权值(注:若为无向图,则每条边可由两条方向相反的有向边构成);若无边相连则已设定的权值最大值MaxWeight=1000代替。利用顶点与边的信息建立网的邻接矩阵,并第一个输入的顶点为原点对网进行深度优先和广度优先遍历,并输入遍历的顶点序列。

例:如下图7-1图所示,则输入为: 6 ABCDEF 18 A B 34 A E 12 B A 34 B C 46 B F 19 C B 46 C D 17 C F 25 D C 17

D E 38 D F 25 E A 12 E D 38 E F 26 F B 19 F D 25 F C 25 F E 26

34BA122625E1946CF251738D 图7-1 网的图示表示

在提供的程序模板中,完成以下函数,实现上述功能; (1) DFSTraverse (MGraph G)

功能描述:对网进行深度优先遍历,网可以非连通 (2) BFSTraverse (MGraph G)

功能描述:对网进行广度优先遍历,网可以非连通 2.最短路径求解

详细描述:在第一题的基础上,Dijkastra算法求解从第A个顶点到其余各个顶点的最短路径的所经过的顶点以及路径的长度。

例:如图7-1所示,则该求出顶点A到其余个顶点的最短路径所经过的顶点,以及路径的长度;输出如下所示:

A->B: A B 34 A->C: A E F C 63 A->D: A E D 50 A->E: A E 12

A->F: A E F 38

在提供的程序模板中,完成以下函数,实现上述功能;

void dijkstra(MGraph G, int vs )

3. 验证练习

先对下图7-2和7-3进行深度和广度优先遍历,并求出以A作为源点求最短路径的结果。并通过输入图的信息执行图的遍历和求最短路径程序,比较运行结果与你求的结果是否一致,若有不一致请查明原因。

A10B18C161572040F20D1822580EB7C1092011A5D18F

253030E图7-2 图7-3

四、 程序代码及运行结果

【程序代码】

#include #include //#include #include

#define bool int #define true 1 #define false 0

#define MAX_VERTEX_NUM 20 //最大顶点个数 #define INFINITY INT_MAX //最大值∞

typedef char VertexType; //顶点向量类型 typedef int VRType; typedef int InfoType; typedef int QElemType;

//图的数组存储表示 typedef struct {

VertexType vexs[MAX_VERTEX_NUM]; //顶点向量

VRType arcs[MAX_VERTEX_NUM][MAX_VERTEX_NUM];; //邻接矩阵,于无权图1、0表示两个顶点是

否相邻,对于有权图为权值

int vexnum, arcnum; //图的顶点数和弧数

}MGraph;

bool visited[MAX_VERTEX_NUM]; //标记顶点是否被访问,访问为true,否则为false

//查找顶点在顶点向量中的位置

int locateVertex(MGraph umg, VertexType v) { }

//创建无向(有向)无权图 void createUMGraph(MGraph *umg) {

//将图中相邻的顶点的邻接矩阵值设为1,不相邻仍为0 printf(\输入边的信息,输入边的两个顶点名称v1 v2\\n\); for (v = 0; v < (*umg).arcnum; v++) {

printf(\输入第%d条边两个顶点:\, v); //初始化邻接矩阵

for (i = 0; i < (*umg).vexnum; i++)

for (j = 0; j < (*umg).vexnum; j++)

(*umg).arcs[i][j] = 0;

int i, j, v; char v1, v2;

printf(\输入无权图的顶点数和边数\\n\);

scanf(\, &(*umg).vexnum, &(*umg).arcnum); for (v = 0; v < (*umg).vexnum; v++)

visited[v] = false; getchar();

printf(\输入顶点名称\\n\);

for (v = 0; v < (*umg).vexnum; v++) { }

printf(\输入第%d个顶点名称:\, v); scanf(\, &(*umg).vexs[v]); getchar(); int i;

for (i = 0; i < umg.vexnum; i++) { }

return -1;

if (v == umg.vexs[i])

return i;

}

}

scanf(\, &v1, &v2); getchar(); printf(\);

i = locateVertex(*umg, v1); j = locateVertex(*umg, v2);

// (*umg).arcs[i][j] = (*umg).arcs[j][i] = 1; //由于是无向图,因此一条边关(*umg).arcs[i][j] = 1; //有向图,边为单向

联两个顶点

//创建无向(有向)有权图 void createMGraph(MGraph *mg) {

//将图中相邻的顶点的邻接矩阵值设为边的权值

printf(\输入边的信息,输入边的两个顶点名称和权值v1 v2 w\\n\); for (v = 0; v < (*mg).arcnum; v++) {

printf(\输入第%d条边两个顶点和权值:\, v); scanf(\, &v1, &v2, &w); getchar();

i = locateVertex(*mg, v1); j = locateVertex(*mg, v2);

// (*mg).arcs[i][j] = (*mg).arcs[j][i] = w; //由于是无向图,因此一条边关联//初始化邻接矩阵

for (i = 0; i < (*mg).vexnum; i++)

for (j = 0; j < (*mg).vexnum; j++)

(*mg).arcs[i][j] = INFINITY;

int i, j, v, w; char v1, v2;

printf(\输入有权图的顶点数和边数\\n\);

scanf(\, &(*mg).vexnum, &(*mg).arcnum); for (v = 0; v < (*mg).vexnum; v++)

visited[v] = false; getchar();

printf(\输入顶点名称\\n\);

for (v = 0; v < (*mg).vexnum; v++) { }

printf(\输入第%d个顶点名称:\, v); scanf(\, &(*mg).vexs[v]); getchar();

数据结构实验六 图结构及其应用

实验七图结构及其应用一、实验目的1.掌握图类的邻接矩阵存储结构的实现;2.掌握图的基本操作,包括图的建立、广度优先遍历和深度优先遍历算法;3.掌握求最短路径的Dijkastra算法。二、实验要求1.复习课本中第7章关于图的相关知识内容;2.用C++语言完成算法和程序设计并且调
推荐度:
点击下载文档文档为doc格式
47xpb39yx64qfr01784a35m4y31es80156r
领取福利

微信扫码领取福利

微信扫码分享