邻接表 实现图的遍历 C++

#include <iostream>
#include <queue>
using namespace std;

const int MaxSize = 5;
struct ArcNode				//边表节点
{
	int adjvex;
	ArcNode* next;
};

template <class T>
struct VertexNode			//定义顶点表节点
{
	T vertex;
	ArcNode* firstedge;
};

template <class T>
class AdjGraph
{
public:
	AdjGraph(T a[],int n,int e);		//构造函数,建立具有n个顶点e条边的图
	void dfsTraverse(int v);		//深度优先遍历图
	void bfsTraverse(int v);		//广度优先遍历图
	void Insert(int a,int b);		//插入边表
	void Show();						//显示邻接表
private:
	VertexNode<int> adjlist[MaxSize];	//存放顶点表的数组
	int vertexNum, arcNum;			//图的顶点数和边数
	int visited[MaxSize];			//有没访问数组
	queue<int> que;
};

template <class T>
AdjGraph<T>::AdjGraph(T a[],int n,int e)
{
	vertexNum = n;arcNum = e;
	for(int i=0;i<vertexNum;i++)	//初始化头节点表
	{
		visited[i]=0;
		adjlist[i].vertex = a[i];
		adjlist[i].firstedge=NULL;
	}
}

template <class T>
void AdjGraph<T>::Insert(int vertex,int arcNode)
{
	ArcNode *pArc = new ArcNode();
	pArc->adjvex = arcNode;
	if(adjlist[vertex].firstedge == NULL)
		adjlist[vertex].firstedge=pArc;
	else
	{
		ArcNode *p = adjlist[vertex].firstedge;
		while(p->next!=NULL)
			p = p->next;
		p->next = pArc;
	}
}

template <class T>
void AdjGraph<T>::Show()
{
	cout<<"邻接表为:"<<endl;
	for(int i = 0; i < vertexNum; i++)
	{
		cout <<adjlist[i].vertex;
		ArcNode *p = adjlist[i].firstedge;
		while(p != NULL)
		{
			cout << "->" << p->adjvex;
			p = p->next;
		}
		cout << "->NULL" << endl;
     }
}

template <class T>
void AdjGraph<T>::dfsTraverse(int v)			//深度优先
{
	cout<<adjlist[v].vertex<<" ";
	visited[v]=1;
	ArcNode *p = adjlist[v].firstedge;			//指向顶点v的边表
	while(p!=NULL)
	{
		int j = p->adjvex;
		if(visited[j]==0)dfsTraverse(j);
		p=p->next;
	}
}

template <class T>
void AdjGraph<T>::bfsTraverse(int v)			//广度优先
{
	for(int i=0;i<vertexNum;i++)				//被访问节点初始化
	{
		visited[i]=0;
	}
	cout<<adjlist[v].vertex<<" ";
	visited[v]=1;
	que.push(v);								//先把第一个元素放入队列
	while(que.empty()!=1)							//队列非空时
	{
		v = que.front();						//获取队头元素并弹出
		que.pop();
		ArcNode *p = adjlist[v].firstedge;			//指向顶点v的边表
		while(p!=NULL)
		{
			int j = p->adjvex;
			if(visited[j]==0)					//若没被访问
			{
				cout<<adjlist[j].vertex<<" ";
				visited[j]=1;
				que.push(j);
			}
			p=p->next;
		}
	}
}


void main()
{
	int a[5] = {0,1,2,3,4};
	AdjGraph<int> myGraph(a,5,6);
	myGraph.Insert(0,1);
	myGraph.Insert(0,3);
	myGraph.Insert(1,0);
	myGraph.Insert(1,2);
	myGraph.Insert(1,4);
	myGraph.Insert(2,1);
	myGraph.Insert(2,3);
	myGraph.Insert(2,4);
	myGraph.Insert(3,0);
	myGraph.Insert(3,2);
	myGraph.Insert(4,2);
	myGraph.Insert(4,1);
	myGraph.Show();

	cout<<endl<<"深度优先遍历:"<<endl;
	myGraph.dfsTraverse(0);
	cout<<endl;

	cout<<endl<<"广度优先遍历:"<<endl;
	myGraph.bfsTraverse(0);
	cout<<endl;
}

    原文作者:数据结构之图
    原文地址: https://blog.csdn.net/a13155283231/article/details/53401283
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞

发表评论

电子邮件地址不会被公开。 必填项已用*标注