数据结构学习笔记(C++):邻接矩阵实现图的存储结构

一、实现功能:

1、通过邻接矩阵完成图的创建。

2、完成深度优先和广度优先遍历。

二、示意图

(1)需要程序实现的无向图如下:

数据结构学习笔记(C++):邻接矩阵实现图的存储结构

 (2)邻接矩阵和顶点表的图示:

数据结构学习笔记(C++):邻接矩阵实现图的存储结构

三、程序代码:

1、输入样例:(有关系的结点下标)

0 1
0 2
1 3
1 4
4 2
2 0

2、输出样例:

 数据结构学习笔记(C++):邻接矩阵实现图的存储结构

 3、程序代码:

#include<iostream>

#define MAXSIZE 100

using namespace std;

int visited[MAXSIZE] = { 0 };//全局变量数组初始化,用来标记访问完的顶点

class MGraph
{
public:
	MGraph(char a[], int n, int e);//有参构造函数
	~MGraph();
public:
	void DFtraverse(int v);//深度遍历
	void BFtraverse(int v);//广度遍历
private:
	char vertex[MAXSIZE];//顶点表
	int edge[MAXSIZE][MAXSIZE];//边表
	int VertexNum, EdgeNum;//顶点数,边数
};
//构造函数
MGraph::MGraph(char a[], int n, int e)
{
	int i, j, k;//i,j:顶点下标,k:边数
	VertexNum = n;
	EdgeNum = e;
	for (i = 0; i < VertexNum; i++)//存入顶点信息
		vertex[i] = a[i];
	for (i = 0; i < VertexNum; i++)//初始化邻接矩阵
		for (j = 0; j < VertexNum; j++)
			edge[i][j] = 0;
	for (k = 0; k < EdgeNum; k++)//输入顶点的边
	{
		cin >> i >> j;//输入关系边(相连的顶点下标)
		edge[i][j] = 1;//有关系的置为1
		edge[j][i] = 1;//因为此图是无向图,所以邻接矩阵是对称矩阵
	}
}
//析构函数
MGraph::~MGraph()
{
	//静态存储分配
	//自动释放存储空间
	//析构函数为空
}
//深度优先遍历(栈结构-递归)
void MGraph::DFtraverse(int v)
{
	cout << vertex[v]<<'\t';
	visited[v] = 1;
	for (int j = 0; j < VertexNum; j++)
	{
		if (edge[v][j] == 1 && visited[j] == 0)//遍历邻接矩阵,如果发现两顶点有关系并且这个顶点未被访问
			DFtraverse(j);//就递归,访问这个顶点(在下次递归的函数中输出这个顶点值,并标记以访问)
	}
}
//广度优先遍历(队列结构)
void MGraph::BFtraverse(int v)
{
	for (int i = 0; i < 5; i++)//初始顶点都未被访问,标记为0-------------------------在主函数中程序执行遵循自上而下的顺序规则,所以在实现深度遍历后visited[i]已经全被标记,所以想要接着执行广度遍历,再次函数中要访问数组重新初始化
		visited[i] = 0;			//也可以通过在主函数中添加判断或者开关语句实现遍历功能

	int w, j, Q[MAXSIZE];//创建顺序队列(w出队暂存  j 迭代器)
	int front = -1; int rear = -1;//队列初始化
	cout << vertex[v]<<"\t"; visited[v] = 1;//访问并标记此节点已经访问完了
	Q[++rear] = v;//被访问的顶点入队
	while (front != rear)//队列存在
	{
		w = Q[++front];//出队
		for (j = 0; j < VertexNum; j++)
			if (edge[w][j] == 1 && visited[j] == 0)//遍历队列,如果边存在关系,并且未被访问
			{
				cout << vertex[j]<<"\t";//访问该顶点
				visited[j] = 1;//标记已访问
				Q[++rear] = j;//入队
			}
	}
}

int main()
{
	int i;
	char ch[] = { 'A','B','C','D','E' };
	MGraph MG{ ch,5,6 };//在构造函数中传入初始默认参数{5个顶点6个边}
	for (i = 0; i < 5; i++)//初始顶点都未被访问,标记为0
		visited[i] = 0;
	cout << endl<<"深度优先遍历是:" << endl;
	MG.DFtraverse(0);//从顶点0出发
	cout << endl<<"广度优先遍历是:" << endl;
	MG.BFtraverse(0);
	return 0;
}

上一篇:循环数组实现 队列


下一篇:高级数据结构02(图)