基于邻接表的有向图实现
邻接表
图的链式存储结构
基于链表的相关操作
结点结构体
顶点表结点
struct VertexNode //顶点表结点
{
char vertex;
EdgeNode *firstEdge;
};
边表结点
struct EdgeNode //定义边表结点
{
int adjvex; //临接点域(编号)
EdgeNode *next;
};
图类的设计
class ALGraph
{
private:
VertexNode adjlist[MaxSize]; //存放顶点表的数组
int vertexNum,edgeNum; //图的顶点数和边数
int visited[MaxSize];
public:
ALGraph(char a[],int n,int e); //参数为结点数据域、顶点数量、边的数量
~ALGraph();
void initVisited();
void DFTraverse(int v); //深度优先遍历
void BFTraverse(int v); //广度优先遍历
void showEdgeInfo(); //展示边的信息
};
关键算法实现
深度优先遍历
void ALGraph::DFTraverse(int v)
{
int j;
EdgeNode *p=nullptr;
cout<<adjlist[v].vertex;
visited[v]=1;
p=adjlist[v].firstEdge; //工作指针指向顶点V的边表
while (p!=nullptr)
{
j=p->adjvex;
if(visited[j]==0) DFTraverse(j);
p=p->next;
}
}
广度优先遍历
void ALGraph::BFTraverse(int v)
{
int w,j,Q[MaxSize]; //投机队列
int front=-1,rear=-1;
EdgeNode *p=nullptr;
cout<<adjlist[v].vertex;
visited[v]=1;
Q[++rear]=v; //被访问顶点入队
while(front!=rear)
{
w=Q[++front];
p=adjlist[w].firstEdge; //工作指针指向顶点v的边表
while(p!=nullptr)
{
j=p->adjvex;
if(visited[j]==0)
{
cout<<adjlist[j].vertex;
visited[j]=1;
Q[++rear]=j;
}
p=p->next;
}
}
}
展示边表信息
void ALGraph::showEdgeInfo()
{
for(int i=0;i<vertexNum;i++)
{
cout<<"编号为:"<<i<<",数据信息为:"<<adjlist[i].vertex<<"的顶点的边表信息:";
EdgeNode *p=adjlist[i].firstEdge;
while(p!=nullptr)
{
cout<<p->adjvex<<","<<adjlist[p->adjvex].vertex<<"--";
p=p->next;
}
cout<<endl;
}
}
源代码
ALGraph.h
/*基于邻接表的有向图实现*/
#include<iostream>
using namespace std;
struct EdgeNode //定义边表结点
{
int adjvex; //临接点域(编号)
EdgeNode *next;
};
struct VertexNode //顶点表结点
{
char vertex;
EdgeNode *firstEdge;
};
const int MaxSize=10;
class ALGraph
{
private:
VertexNode adjlist[MaxSize]; //存放顶点表的数组
int vertexNum,edgeNum; //图的顶点数和边数
int visited[MaxSize];
public:
ALGraph(char a[],int n,int e); //参数为结点数据域、顶点数量、边的数量
~ALGraph();
void initVisited();
void DFTraverse(int v); //深度优先遍历
void BFTraverse(int v); //广度优先遍历
void showEdgeInfo(); //展示边的信息
};
ALGraph.cpp
#include"ALGraph.h"
ALGraph::ALGraph(char a[],int n,int e)
{
int i,j,k;
EdgeNode *s=nullptr;
vertexNum=n;
edgeNum=e;
for(i=0;i<vertexNum;i++)
{
//初始化顶点表
adjlist[i].vertex=a[i];
adjlist[i].firstEdge=nullptr;
}
for(k=0;k<edgeNum;k++)
{
//依次输入每一条边的信息
cout<<"请输入边的顶点信息:";
cin>>i>>j;
s=new EdgeNode;
s->adjvex=j;
s->next=adjlist[i].firstEdge; //将结点s插入表头
adjlist[i].firstEdge=s;
}
}
ALGraph::~ALGraph()
{
EdgeNode *p=nullptr;
EdgeNode *q=nullptr;
for(int i=0;i<vertexNum;i++)
{
p=q=adjlist[i].firstEdge;
while(p!=nullptr)
{
p=p->next;
delete q;
q=p;
}
}
}
void ALGraph::initVisited()
{
for(int i=0;i<MaxSize;i++)
{
this->visited[i]=0;
}
}
void ALGraph::DFTraverse(int v)
{
int j;
EdgeNode *p=nullptr;
cout<<adjlist[v].vertex;
visited[v]=1;
p=adjlist[v].firstEdge; //工作指针指向顶点V的边表
while (p!=nullptr)
{
j=p->adjvex;
if(visited[j]==0) DFTraverse(j);
p=p->next;
}
}
void ALGraph::BFTraverse(int v)
{
int w,j,Q[MaxSize]; //投机队列
int front=-1,rear=-1;
EdgeNode *p=nullptr;
cout<<adjlist[v].vertex;
visited[v]=1;
Q[++rear]=v; //被访问顶点入队
while(front!=rear)
{
w=Q[++front];
p=adjlist[w].firstEdge; //工作指针指向顶点v的边表
while(p!=nullptr)
{
j=p->adjvex;
if(visited[j]==0)
{
cout<<adjlist[j].vertex;
visited[j]=1;
Q[++rear]=j;
}
p=p->next;
}
}
}
void ALGraph::showEdgeInfo()
{
for(int i=0;i<vertexNum;i++)
{
cout<<"编号为:"<<i<<",数据信息为:"<<adjlist[i].vertex<<"的顶点的边表信息:";
EdgeNode *p=adjlist[i].firstEdge;
while(p!=nullptr)
{
cout<<p->adjvex<<","<<adjlist[p->adjvex].vertex<<"--";
p=p->next;
}
cout<<endl;
}
}
测试
main.cpp
#include"ALGraph.h"
int main()
{
cout<<"基于邻接表的有向图"<<endl;
char data[]={'A','B','C','D','E'};
int i;
ALGraph ALG(data,5,4);
cout<<"各顶点的边表信息如下:"<<endl;
ALG.showEdgeInfo();
ALG.initVisited();
cout<<"深度优先遍历序列:";
ALG.DFTraverse(0);
cout<<endl;
ALG.initVisited();
cout<<"广度优先遍历序列:";
ALG.BFTraverse(0);
cout<<endl;
system("pause");
return 0;
}