#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;
}
邻接表 实现图的遍历 C++
原文作者:数据结构之图
原文地址: https://blog.csdn.net/a13155283231/article/details/53401283
本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
原文地址: https://blog.csdn.net/a13155283231/article/details/53401283
本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。