图的存储方法——邻接表(动态存储)

基本思想:

1.每一个顶点都可以引出一条单链表。(对于每一个顶点vi,将所有邻接于vi的顶点连接成为一个单链表,称为顶点vi的边表。)用来存储边的
2.所有边表的头指针存储顶点信息的一维数组,构成了顶点表
在这里插入图片描述
两种节点结构
vertex:数据域,储存顶点信息。
firstedge:指针域,指向下一个邻接的顶点。
adjvex:邻接点域,边的终点再顶点表中的下标。
next:指针域,边表的下一个节点。

如何定义节点结构?

代码中解答

//定义结构体数据,表示边表的节点。
struct ArcNode{
	int adjvex;	//边的终点的下标	
	ArcNode *next; 	//指向下一个节点
}
template<class T>
struct VertexNode{
	T vertex;		//这里用了模板,不知道节点是啥类型
	ArcNode *firstedge;	//firstedge指向的节点类型是ArcNode
}

形象表示,深化理解

在这里插入图片描述
用邻接表把上图表示出来:
在这里插入图片描述
注意:
1、每一个节点表示一个边,邻接表的空间复杂度为O(n+e);
2、可测试是否存在vivj的边.
3、无向图中,vi的节点个数表示他的度,有向图中则表示出度
那如何算入度呢?
利用逆邻接表,逆邻接表则为,在有向图中每个顶点vi为边的终点,(即箭头指向vi)依照邻接表的方法,构造一个逆邻接表

邻接表存储图的构造

直接上代码,其中加注释

const int maxsize=10//最大顶点数设置为10;由实际情况而定
template<class T>
class Graph{
private:
	VertexNode adjlist[maxsize];//一维数组存储每个节点,并且存在指针域引出单链表
	int vextexNum,arcNum;	//顶点个数,边个数、
public:
	Graph(T a[],int n,int e){
		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<edgeNum;k++){
			cin>>i>>j;		//输入边的起点和终点
			s=new ArcNode;		//创建一个表示边的节点
			s->adjvex=j;		//节点s的adjvex表示边的终点,即为j
			s->next=adjlist[i[.firstedge;	//s的next,下一个节点目前还没有,为空,即NULL。
			adjlist[i].firstedge=s;		//链接顶点与边,头指针与新节点连接,新节点则为顶点的第一个连接点,即vi的firstedge;
		}
	}
	
};
发布了36 篇原创文章 · 获赞 3 · 访问量 3531

猜你喜欢

转载自blog.csdn.net/qq_43628835/article/details/103334613