图的邻接表实现
邻接表是图的一种链式存储结构。主要是应对于邻接矩阵在顶点多边少的时候,浪费空间的问题。它的方法就是声明两个结构。如下图所示:
先来看看伪代码:
typedef char Vertextype;
//表结点结构
struct ArcNode {
int adjvex; //某条边指向的那个顶点的位置(一般是数组的下标)。
ArcNode * nextarc; //指向下一个表结点
int weight; //这个只有网图才需要使用。普通的图可以直接忽略
};
//头结点
struct Vnode
{
Vertextype data; //这个是记录每个顶点的信息(现在一般都不需要怎么使用)
ArcNode * firstarc; //指向第一条依附在该顶点边的信息(表结点)
};
1、无向图
该无向图中表节点下的数字1、2、3、0对应的是头结点的下标,用此表示每个头结点与其他的哪些节点相连
2、有向图
该有向图中表节点下的数字1、2、3对应的是头结点的下标,用此表示每个头结点与其他的哪些节点具有指向关系
有向图的邻接表代码实现:
#include<cstdio> #include<iostream> #include<cstring> #include<vector> using namespace std; const int max_v=100;int main() {int v,e;int V[max_v];cin>>v>>e;///输入顶点和边的个数for(int i=0;i<v;i++){cin>>V[i];///输入顶点的值 }int x,y;vector<int> G[max_v]; //vector的用法:https://blog.csdn.net/hancunai0017/article/details/7032383
for(int i=0;i<e;i++){cin>>x>>y;G[x].push_back(y);///节点x的下一个节点是y }for(int i=0;i<v;i++){cout<<V[i]<<"->";for(int j=0;j<G[V[i]].size();j++)//此处的G[V[i]].size()的含义参考另一篇关于拓扑排序的博客{cout<<G[V[i]][j]<<' ';}cout<<endl;}return 0; }
输入:
5 6
0 1 2 3 4
0 1
1 3
2 1
3 0
3 2
4 3
结果显示:
0->1
1->3
2->1
3->0 2
4->3