#include <iostream>
using namespace std;
const int maxsize=10;
int visited[maxsize]={0};
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);//深度优先遍历
void BFSTraverse(int v);//广度优先遍历
private:
VertexNode<DataType> adjlist[maxsize];//存放顶点表的数组
int vertexNum,arcNum;//图的顶点数和边数
};
template<class DataType>
ALGraph<DataType>::ALGraph(DataType a[],int n,int e)
{
ArcNode * s;
vertexNum=n;
arcNum=e;
for(int i=0;i<vertexNum;i++)//存储顶点信息,初始化顶点表
{
adjlist[i].vertex=a[i];
adjlist[i].firstedge=NULL;
}
for(int k=0;k<arcNum;k++)
{
int x,y;
cout<<"请输入边的两个顶点的序号:";//输入边所依附的两个顶点的编号
cin>>x>>y;
s=new ArcNode;s->adjvex=y;//生成一个边表节点s
s->next=adjlist[x].firstedge;
adjlist[x].firstedge=s;//将结点s插入到第i个边表的表头
}
}
template<class DataType>
void ALGraph<DataType>::DFSTraverse(int v)
{
cout<<adjlist[v].vertex;visited[v]=1;
ArcNode *p=NULL; p=adjlist[v].firstedge;
int j;
while(p!=NULL)
{
j=p->adjvex;
if(visited[j]==0)DFSTraverse(j);
p=p->next;
}
}
template <class DataType>
void ALGraph<DataType>::BFSTraverse(int v)
{
int Q[maxsize];
int rear=-1,front=-1;//1.初始化队列
ArcNode *p=NULL;
cout<<adjlist[v].vertex;
visited[v]=1;
Q[++rear]=v;//2.
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;
}
}
}
int main()
{
char ch[]={'0','1','2','3','4','5'};
int i;
ALGraph<char>ALG(ch,6,8);
for(i=0;i<maxsize;i++)//初始化图中所有结点都未被访问
visited[i]=0;
cout<<"广度优先遍历序列是:";
ALG.BFSTraverse(0);
cout<<endl;
for(i=0;i<maxsize;i++)//初始化图中所有结点都未被访问
visited[i]=0;
ALGraph<char>ALG1(ch,6,6);
cout<<"深度优先遍历序列是:";
ALG1.DFSTraverse(0);
cout<<endl;
return 0;
}
有向图邻接表的实现
最新推荐文章于 2024-09-29 13:15:00 发布