实验目的:
掌握图的结构特征,以及邻接矩阵和邻接表存储结构的特点和建立方法;掌握在邻接矩阵或邻接表存储结构下图的深度优先和广度优先遍历算法的设计方法。
实验条件:计算机一台,vc++6.0
实验内容与算法思想:
内容:
建立图的邻接矩阵或邻接表存储结构并以邻接矩阵或邻接表为存储结构实现图的深度优先或广度优先遍历算法。
算法思想:
创建一个邻接矩阵的储存结构,vertex数组代表顶点向量集,arc二维数组储存邻接矩阵弧的权值,创建vexnum和arcnum整型变量代表顶点数和弧数。用邻接矩阵表示法创建无向图,CreateDN函数中,将顶点数、弧数和顶点名称储存进一维数组,通过一个for循环输入弧两边的顶点,再通过LocateVertex函数得出顶点的在二维数组邻接矩阵的位置,其值赋予1,表示两个顶点互相连接组成一个弧,设置一个访问数组visited,首先实现对v0所在连通子图的深度优先搜索,访问出发点v0,依次以v0未被访问的作为邻接点出发点,深度优先搜索图,直至图中所有与v0有路径相通的顶点都被访问。若非连通图,则图中一定还有顶点未被访问,需要从图中的另一个未被访问的顶点作为起始点,重复上述深度优先搜索过程,直至图中所有的顶点均被访问为止。
运行结果:
代码实现:
#include <stdio.h>
#include <string.h>
#define MaxVertexNum 50 /*最多顶点个数*/
#define True 1
#define False 0
#define Error -1
#define OK 1
typedef enum {
DG, DN, UDG, UDN} GraphKind; /*枚举类型*/
typedef struct ArcNode {
int adj; /*对于无权图,用1或0表示是否相邻;对带权图,则为权值类型*/
int info;
} ArcNode;
int visited[MaxVertexNum]; /*访问数组标志*/
typedef struct //图的邻接矩阵存储结构
{
char vertex[MaxVertexNum]; //顶点向量
ArcNode arcs[MaxVertexNum][MaxVertexNum]; //邻接矩阵
int vexnum,arcnum; //图中当前的顶点数和边数
GraphKind kind