第一范文网 - 专业文章范例文档资料分享平台

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

来源:用户分享 时间:2025/5/20 18:22:01 本文由loading 分享 下载这篇文档手机版
说明:文章内容仅供预览,部分内容可能不全,需要完整文档或者需要复制内容,请下载word后使用。下载word有问题请添加微信号:xxxxxxx或QQ:xxxxxx 处理(尽可能给您提供完整文档),感谢您的支持与谅解。

实验七 图结构及其应用

一、 实验目的

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();

搜索更多关于: 数据结构实验六 图结构及其应用 的文档
数据结构实验六 图结构及其应用.doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.diyifanwen.net/c47xpb39yx64qfr01784a35m4y31es80156r_1.html(转载请注明文章来源)
热门推荐
Copyright © 2012-2023 第一范文网 版权所有 免责声明 | 联系我们
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:xxxxxx 邮箱:xxxxxx@qq.com
渝ICP备2023013149号
Top