码迷,mamicode.com
首页 > 其他好文 > 详细

图的存储-邻接表

时间:2015-02-22 11:05:55      阅读:177      评论:0      收藏:0      [点我收藏+]

标签:数据结构      邻接表   

图的邻接表之前实现的时候,一直有点小问题

现在才明白 原来头结点是有内容的,之前一直当做一个标志位置来使用

说到底,这就是一种顺式和链式相互结合的储存结构


但还是不知其所以然,这个结构相较于邻接矩阵除了空间储存上面有很大优势,还有访问邻接节点方便

不明白他还有什么非他不可的理由

(其实就是因为自己对链式结构操作不是很熟悉找了个借口。)


邻接表(Adjacency List)是图的一种顺序存储与链式存储结合的存储方法。邻接表表示法类似于树的孩子链表表示法。就是对于图G 中的每个顶点vi,将所有邻接于vi 的顶点vj 链成一个单链表,这个单链表就称为顶点vi 的邻接表,再将所有点的邻接表表头放到数组中,就构成了图的邻接表。在邻接表表示中有两种结点结构

技术分享

一种是顶点表的结点结构,它由顶点域(vertex)和指向第一条邻接边的指针域(firstedge)构成,另一种是边表(即邻接表)结点,它由邻接点域(adjvex)和指向下一条邻接边的指针域(next)构成。对于网图的边表需再增设一个存储边上信息(如权值等)的域(info),网图的边表结构如图8.10 所示。

技术分享

邻接表表示的形式描述如下:

#define MaxVerNum 100 /*最大顶点数为100*/

typedef struct node{ /*边表结点*/
	int adjvex; /*邻接点域*/
	struct node * next; /*指向下一个邻接点的指针域*/
	/*若要表示边上信息,则应增加一个数据域info*/
}EdgeNode;

typedef struct vnode{ /*顶点表结点*/
	VertexType vertex; /*顶点域*/
	EdgeNode * firstedge; /*边表头指针*/
}VertexNode;

typedef VertexNode AdjList[MaxVertexNum]; /*AdjList 是邻接表类型*/

typedef struct{
	AdjList adjlist; /*邻接表*/
	int n,e; /*顶点数和边数*/
}ALGraph; /*ALGraph 是以邻接表方式存储的图类型*/

建立一个有向图的邻接表存储的算法如下:

void CreateALGraph(ALGraph *G)
{/*建立有向图的邻接表存储*/
	int i,j,k;
	EdgeNode * s;
	
	printf("请输入顶点数和边数(输入格式为:顶点数,边数):\n");
	scanf("%d,%d",&(G->n),&(G->e)); /*读入顶点数和边数*/
	printf("请输入顶点信息(输入格式为:顶点号<CR>):\n");
	
	for (i=0;i<G->n;i++) /*建立有n 个顶点的顶点表*/
	{
	scanf("\n%c",&(G->adjlist[i].vertex)); /*读入顶点信息*/
	G->adjlist[i].firstedge=NULL; /*顶点的边表头指针设为空*/
	}
	
	printf("请输入边的信息(输入格式为:i,j):\n");
	
	for (k=0;k<G->e;k++) /*建立边表*/
	{scanf("\n%d,%d",&i,&j); /*读入边<Vi,Vj>的顶点对应序号*/
	s=(EdgeNode*)malloc(sizeof(EdgeNode)); /*生成新边表结点s*/
	s->adjvex=j; /*邻接点序号为j*/
	s->next=G->adjlist[i].firstedge; /*将新边表结点s 插入到顶点Vi 的边表头部*/
	G->adjlist[i].firstedge=s;
	}
}/*CreateALGraph*/

若无向图中有n 个顶点、e 条边,则它的邻接表需n 个头结点和2e 个表结点。显然,在边稀疏(e<<n(n-1)/2)的情况下,用邻接表表示图比邻接矩阵节省存储空间,当和边相关的信息较多时更是如此。

在无向图的邻接表中,顶点vi 的度恰为第i 个链表中的结点数;而在有向图中,第i个链表中的结点个数只是顶点vi 的出度,为求入度,必须遍历整个邻接表。在所有链表中其邻接点域的值为i 的结点的个数是顶点vi 的入度。有时,为了便于确定顶点的入度或以顶点vi 为头的弧,可以建立一个有向图的逆邻接表,即对每个顶点vi 建立一个链接以vi为头的弧的链表。例如图8.12 所示为有向图G2(图8.2)的邻接表和逆邻接表。

技术分享

在建立邻接表或逆邻接表时,若输入的顶点信息即为顶点的编号,则建立邻接表的复杂度为O(n+e),否则,需要通过查找才能得到顶点在图中位置,则时间复杂度为O(n·e)。

在邻接表上容易找到任一顶点的第一个邻接点和下一个邻接点,但要判定任意两个顶点(vi 和vj)之间是否有边或弧相连,则需搜索第i 个或第j 个链表,因此,不及邻接矩阵方便。

图的存储-邻接表

标签:数据结构      邻接表   

原文地址:http://blog.csdn.net/rainxbow/article/details/43899961

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!