邻接表 深度优先 广度优先 遍历图

本文详细介绍了使用C++实现的图数据结构,包括邻接表的定义以及深度优先搜索(DFS)和宽度优先搜索(BFS)的遍历算法。这些算法在图的遍历和搜索中具有重要应用。通过实例展示了如何创建图,并对图进行深度和广度优先遍历,输出遍历序列。
摘要由CSDN通过智能技术生成
#ifndef ALGraph_H
#define ALGraph_H
const int MaxSize = 10;
struct ArcNode 
{
	int adjvex;
	ArcNode* next;
};
template <class DataType>
struct VertexNode
{
	DataType vertex;
	ArcNode* firstedge;
};
template<class DataType>
class ALGraph
{
public:
	ALGraph(DataType a[], int n, int e);
	~ALGraph();
	void DFSTraverse(int v, int visited[]);
	void BFSTraverse(int v, int visited[]);
private:
	VertexNode<DataType>adjlist[MaxSize];//存放顶点的数组
	int vertexNum, arcNum;               //图的顶点数和边数
};
#endif // !ALGraph_H





#include <iostream>
using namespace std;
#include "MGraph.h"

template<class DataType>
ALGraph<DataType>::ALGraph(DataType a[], int n, int e)
{
	ArcNode* s;
	int i, j, k;
	vertexNum = n; arcNum = e;
	for (i = 0; i < vertexNum; i++)
	{
		adjlist[i].vertex = a[i];
		adjlist[i].firstedge = NULL;

	}
	for (k = 0; k < arcNum; k++)
	{
		cout << "请输入边的两个顶点的序号:";
		cin >> i >> j;
		s = new ArcNode; s->adjvex = j;
		s->next = adjlist[i].firstedge;
		adjlist[i].firstedge = s;
	}
}
template <class DataType>
ALGraph<DataType>::~ALGraph()
{
	ArcNode* p = NULL;
	for (int i = 0; i < vertexNum; i++)
	{
		p = adjlist[i].firstedge;
		while (p != NULL)
		{
			adjlist[i].firstedge = p->next;
			delete p;
			p = adjlist[i].firstedge;
		}
	}
}

template <class DataType>
void ALGraph<DataType>::DFSTraverse(int v,int visited[])
{
	ArcNode* p = NULL; int j;
	cout << adjlist[v].vertex; visited[v] = 1;
	p = adjlist[v].firstedge;
	while (p != NULL)
	{
		j = p->adjvex;
		if (visited[j] == 0)DFSTraverse(j,visited);
		p = p->next;
	}
}

template<class DataType>
void ALGraph<DataType>::BFSTraverse(int v, int visited[])
{
	int Q[MaxSize];
	int front = -1; int rear = -1;
	ArcNode* p = NULL;
	cout << adjlist[v].vertex; visited[v] = 1; Q[++rear] = v;
	while (front!=rear)
	{
		v = Q[++front];
		p = adjlist[v].firstedge;
		while (p != NULL)
		{
			int j = p->adjvex;
			if (visited[j] == 0)
			{
				cout << adjlist[j].vertex; visited[j] = 1; Q[++rear] = j;
			}
			p = p->next;
		}

	}
}




#include <iostream>
using namespace std;
#include "冲.cpp"
int visited[MaxSize] = { 0 };


int main()
{
	char ch[] = { 'A','B','C','D','E' };
	int i;
	ALGraph<char>ALG(ch, 5, 6);
	for (i = 0; i < MaxSize; i++)
	{
		visited[i] = 0;
	}
		cout << "深度优先遍历序列是:";
		ALG.DFSTraverse(0, visited);
		cout << endl;
		for (i = 0; i < MaxSize; i++)
		{
			visited[i] = 0;
		}
		cout << "广度优先遍历序列是:";
		ALG.BFSTraverse(0, visited);
		cout << endl;
		return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

白开水为啥没味

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值