数据结构——第四章图:02图的存储结构

1.数组表示法(邻接矩阵表示法):用两个数组分别存储数据元素(顶点)的信息和数据元素(顶点)之间关系的信息。若图G是一个具有n个顶点的无权图,G的邻接矩阵是具有如下性质的n × n矩阵A:A[i, j] = 1(若<vi, vj> ∈ VR),反之为0。若图G是一个有n个顶点的网,则它的邻接矩阵是具有如下性质的n × n的矩阵A:A[i, j] = wij(若<vi, vj> ∈ VR),0(对角线上元素),∞(非对角线上元素)

无向图的邻接矩阵举例:

               

 

有向图的邻接矩阵举例:

2.图的数组表示法的特点如下:

(1)存储空间:对于无向图而言,它的邻接矩阵是对称矩阵,可采用压缩存储法,即之存储其下三角元素即可,这样,一个具有n个顶点的无向图G,它的邻接矩阵需要n(n-1)/2个存储空间即可。但对于有向图而言,其中的弧是有方向的,因此有向图的邻接矩阵不一定是对称矩阵,对于有向图的邻接矩阵的存储需要n2个存储空间。

(2)便与运算:采用邻接矩阵,便与判定图中任意两个顶点之间是否有边相连。另外还便于求得各个顶点的度,对于无向图而言,其邻接矩阵第i行元素之和就是图中第i个顶点的度。对于有向图而言,其邻接矩阵第i行元素之和就是图中第i个顶点的出度,其邻接矩阵第i列元素之和就是图中第i个顶点的入度。

3.邻接表表示法:图的数组表示法(即邻接矩阵表示法),虽然有其自身的优点,但对于稀疏图来讲,会造成存储空间的很大浪费。邻接表表示法实际上是图的一种链式存储结构,它克服了邻接矩阵的弊病。在邻接表中,对图中的每个顶点建立一个带头结点的单链表,第i个单链表中的结点表示依附于顶点vi的边(若是有向图,则表示以vi为弧尾的弧)所关联的另一个顶点,每个单链表的头结点又构成一个表头结点表。

4.图的邻接表表示由表头结点表与每个顶点的链表两部分构成。表头结点表:由所有表头结点以顺序结构的形式存储,以便随机访问任一顶点的链表。表头结点的结构由两部分构成,其中数据域data用于存储顶点名或其它有关信息,链域firstarc用于指向链表中下一个顶点(即与顶点vi邻接的第一个邻接点)。顶点单链表的每个结点也由两个域组成,其中邻接点域adjvex指示与顶点vi邻接的点在图中的位置,链域nextarc指示下一条边或弧相关联的顶点。

无向图的邻接表举例:(无向图邻接表中链表的结点数为边个数的两倍)

          

有向图的邻接表举例:(有向图邻接表中链表的结点数等于弧的个数)

          

5.存储空间分析:对于有n个顶点、e条边的无向图而言,若采取邻接表作为存储结构,则需要n个表头结点和2e个表结点。在边很稀疏(即e << n(n-1)/2时)的情况下,用邻接表存储所需的空间比邻接矩阵所需的空间n(n-1)/2要节省得多。

6.无向图的度:在无向图的邻接表中,顶点vi的度恰好就是第i个单链表上结点的个数。

7.有向图的度:在有向图中,第i个单链表上结点的个数是顶点vi的出度,只需通过表头结点表找到第i个顶点的单链表的头指针,实现顺链查找即可。如要判定任意两个顶点(vi和vj)之间是否有边或弧相连,或求得第i个顶点的入度,则需要搜索所有的单链表,操作麻烦。一种解决方法是逆邻接表法,可以对每个顶点vi再建立一个逆邻接表,即对每个顶点vi建立一个所有以顶点vi为弧头的弧的表。

posted @ 2018-11-05 22:21  H36Phaeton  阅读(405)  评论(0编辑  收藏  举报