一、图的邻接矩阵实现
1.实现了以顶点数组、邻接矩阵为存储结构的图;
2.实现了图的创建(包含有向/无向图、有向/无向网)、顶点/边的增删操作、深度/广度优先遍历的算法;
3.采用顶点对象列表、边(弧)对象列表的方式,对图的创建进行初始化;引用 "ObjArrayList.h"头文件,头文件可参看之前博文“数据结构之顺序列表(支持对象元素)”代码;
4.采用将顶点数组空位的下标索引入队列的方式,解决顶点在数组(静态)中因增删操作造成的不连续存储的问题;引用 “LinkQueue.h”头文件,头文件可参看之前博文“数据结构之队列(循环队列、链队列的类模板实现)”代码;
5.深度优先遍历采用递归算法;广度优先遍历采用队列方式实现;
6.测试代码中以有向网的所有带权边作为边的初始化数据,选择图类型(DG, UDG, DN, UDN)可创建成不同类型的图。
二、测试代码中的图结构图
深度优先遍历序列(从 v1 顶点开始):
1.无向图/网:v1-v2-v3-v5-v4-v6-v7
2.有向图/网:v1-v2-v5-v3-v4-v6-v7
广度优先遍历序列(从 v2 顶点开始):
1.无向图/网:v2-v1-v3-v5-v4-v6-v7
2.有向图/网:v2-v5 后序无法遍历
注:有向图的遍历 是遵循出度方向遍历的,若无出度方向,则遍历终止。
三、代码
//文件名:"GraphAdjMat.h"
#pragma once
#ifndef GRAPHADJMAT_H_
#define GRAPHADJMAT_H_
#include <limits>
#include <string>
#include "ObjArrayList.h"
#include "LinkQueue.h"
using namespace std;
/*
. 图(邻接矩阵实现) Graph Adjacency Matrix
. 相关术语:
. 顶点 Vertex ; 边 Arc ;权 Weight ;
. 有向图 Digraph ;无向图 Undigraph ;
. 有向网 Directed Network ;无向网 Undirected Network ;
*/
class GraphAdjMat
{
/*
. 边(弧) 单元,注:邻接矩阵单元
*/
struct ArcCell
{
int adj; //邻接顶点关系。图:0|不相邻 1|相邻 ;网:无穷(INT_MAX)|不相邻 权值(W)|相邻
char * info; //边(弧)信息
};
public:
/*
. 图 种类
*/
enum GraphType
{
DG, //有向图,默认 0
UDG, //无向图,默认 1
DN, //有向网,默认 2
UDN //无向网,默认 3
};
/*
. 边(弧)数据,注:供外部初始化边数据使用
*/
struct ArcData
{
string Tail; //弧尾
string Head; //弧头
int Weight; //权重
};
private:
const int _INFINITY = INT_MAX; //无穷大 注:包含于头文件 <limits>
static const int _MAX_VERTEX_NUM = 10; //支持最大顶点数
//静态存储结构
string vexs[_MAX_VERTEX_NUM]; //顶点表
ArcCell arcs[_MAX_VERTEX_NUM][_MAX_VERTEX_NUM]; //边(弧)矩阵
int vexNum; //顶点数
int arcNum; //边数
int type; //图种类
int nonAdjInt; //不相邻 int 值:0|无权 无穷|有权
LinkQueue<int> *vexs_null_index_queue = new LinkQueue<int>(); //顶点数组中空顶点位置索引队列 (需要销毁)
bool vexs_visited[_MAX_VERTEX_NUM]; //顶点访问标记数组:0|未访问 1|已访问
void _CreateDG(ObjArrayList<ArcData> * arcsList); //创建有向图
void _CreateUDG(ObjArrayList<ArcData> * arcsList); //创建无向图
void _CreateDN(ObjArrayList<ArcData> * arcsList); //创建有向网
void _CreateUDN(ObjArrayList<ArcData> * arcsList); //创建无向网
int _Locate(string vertex); //定位顶点元素位置
void _DFS_R(int index); //深度优先遍历 递归
public:
GraphAdjMat(int type); //构造函数:初始化图类型
~GraphAdjMat(); //析构函数:销毁图存储空间
void Init(ObjArrayList<string> * vexs, ObjArrayList<ArcData> * arcsList); //初始化顶点、边数据为 图|网
void Display(); //显示 图|网
void InsertVertex(string *vertex); //插入一个新顶点
void DeleteVertex(string *vertex); //删除一个顶点
void InsertArc(ArcData *arc); //插入一条新边(弧)
void DeleteArc(ArcData *arc); //删除一条边(弧)
void Display_DFS(string *vertex); //从指定顶点开始,深度优先遍历
void Display_BFS(string *vertex); //从指定顶点开始,广度优先遍历
GraphAdjMat * MiniSpanTree_Prim(string * vertex); //最小生成树(Prim 算法)
GraphAdjMat * MiniSpanTree_Kruskal(string * vertex); //最小生成树(Kruskal 算法)
};
#endif //