目录
近来有空闲,把前几个学期做的实验上传上来。如有错误的地方欢迎大佬批评指正,有更好的方法也期待您的分享~
实验内容
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循环输出顶点及权值。
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循环输出邻接表的结点信息,及其指向的结点、边权值。
3.邻接表深度优先非递归遍历 dfs():
(1)初始化栈
(2)输出起始的顶点,起始顶点改为“已访问”的标志,将起始顶点进栈
(3)重复一下的操作直至栈为空:
(4)取栈顶元素顶点,存在着未被访问的邻结点W
(5)输出顶点W,将顶点W改为“已访问”,将W进栈;
(6)否则,当前顶点退栈;

最低0.47元/天 解锁文章
3225






