数据结构-图(邻接矩阵实现)

本文介绍了使用邻接矩阵存储结构实现图,并详细阐述了如何创建有向/无向图、有向/无向网,以及顶点和边的增删操作。同时,文章讲解了深度优先遍历和广度优先遍历的算法,通过递归和队列分别实现。文中还提供了测试代码中的图结构图和不同类型的图遍历序列,帮助理解图的遍历行为。
摘要由CSDN通过智能技术生成

一、图的邻接矩阵实现


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 // 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值