C++数据结构实验三:图

目录

一、实验目的

二、问题分析及数据结构设计

三、算法设计

四、功能模块程序流程图

五、实验结果

六、算法分析

七、操作说明

八、源代码


近来有空闲,把前几个学期做的实验上传上来。如有错误的地方欢迎大佬批评指正,有更好的方法也期待您的分享~


实验内容

1.编写函数,采用邻接矩阵表示法,构造一个无向网。

2.编写函数,实现从键盘输入数据,建立一个有向图的邻接表。

3.编写函数,输出该邻接表。

4.编写函数,采用邻接表存储实现无向图的深度优先非递归遍历。

5.编写函数,采用邻接表存储实现无向图的广度优先遍历。

6.编写一个主函数,在主函数中设计一个简单的菜单,分别调试上述算法。


一、实验目的

1.熟悉理解图的基本概念、逻辑结构以及存储结构;

2.掌握编程实现图遍历具体算法:深度优先、广度优先;

3.深刻理解图的顺序存储(邻接矩阵)与链式存储(邻接链表)的特性;

4.训练在编程上控制复杂结构的能力,为今后控制更为复杂结构,进而解决有一定难度的复杂问题奠定基础。

二、问题分析及数据结构设计

本次开发任务要求我们编写一个能调试几种构造和搜索图的系统。该任务需要实现以下功能:构造无向网、建立与输出邻接表、深度优先非递归遍历无向图、广度优先遍历无向图等。

其次是数据结构设计,为了实现这些功能,我们需要构建数据模型。图的存储结构除了要存储图中各个顶点本身的信息外,同时还要存储顶点与顶点之间的所有关系(边的信息)。常用的图的存储结构主要有邻接矩阵和邻接表。

首先定义顶点最大个数 MAX_VERTEX_NUM 为100。

定义邻接矩阵中顶点数目为vexnum,边的数目为arcnum;定义一维数组vexs[MAX_VERTEX_NUM]存储顶点信息;定义二维数组arcs[MAX_VERTEX_NUM] [MAX_VERTEX_NUM]存储顶点与顶点之间的关系。

定义邻接表中顶点的数据类型为VerTexData;定义边结点结构体node中,整型目标节点dest,整型边的权值cost,下一边链接指针link;定义顶点结点结构体 VerTexNode 中,顶点数据域data,边链表头指针adj;定义邻接表结构体为 VexList[MAX_VERTEX_NUM],整型顶点和边的实际数分别为n和e。

对于每个功能,我们需要设计相应的函数,函数的输入参数和返回值根据具体的需求进行设计。例如,建立无向图的邻接矩阵的函数使用字符序列g作为输入,没有返回值;非递归深度遍历函数使用节点指针G作为输入,输出遍历的结果等。另外,在实现广度优先遍历功能的过程中,要实现重放也需要额外的存储空间,利用队列的先入先出特性,定义队列q存储顶点信息。

三、算法设计

1.采用邻接矩阵创建无向网 CreateGraph():

(1)用户输入两数字,确定该网的顶点个数G.vexnum与边数G.edgenum;

(2)for循环对顶点G.vertex[i]进行赋值;

(3)for循环输入想要添加的边的权值以及边所依附的两顶点;

(4)调用LocateVex()函数确定两顶点在图中的位置;

(5)对无向图各顶点对称赋值;

(6)for循环输出顶点及权值。

图1 无向图及对应的邻接矩阵

2.创建有向图的邻接表 CreatGraph():

(1)用户输入两数字,确定该网的顶点个数G.n与边数G.e;

(2)for循环输入顶点信息G.VexList[i].data,将G.VexList[i].adj置空,表示该点已经访问过;

(3)逐条边输入,分别输入尾tail,头head,权重weight,创建边链表头指针 p,p->dest指向头head,p->cost指向权重weight。

(4)调用ShowGraph()函数,for循环输出邻接表的结点信息,及其指向的结点、边权值。

图2 有向图及无向图的邻接表存储

3.邻接表深度优先非递归遍历 dfs():

(1)初始化栈

(2)输出起始的顶点,起始顶点改为“已访问”的标志,将起始顶点进栈

(3)重复一下的操作直至栈为空:

(4)取栈顶元素顶点,存在着未被访问的邻结点W

(5)输出顶点W,将顶点W改为“已访问”,将W进栈;

(6)否则,当前顶点退栈;

图3 深度优先搜索过程
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值