图的2种常用的存储形式:
1.数组(邻接矩阵)表示法
2.邻接表
数组表示法:
用一个一维数组存放顶点的元素信息
用一个二维数组存储顶点之间的关系,其中的数据元素A[i][j] = 1,i到j有弧且i≠j,否则A[i][j]= 0
有向图:
OD(vi) = 第i行元素值之和
ID(vi) = 第i列元素之和
无向图:
TD(vi) = 第i行或者第i列的元素值之和
无向图的邻接矩阵是对称矩阵
网的邻接矩阵:
A[i][j] = w[i][j] 若《vi,vj》或(vi,vj)∈E
否则为∞
优点:
易判定任两个顶点之间是否有边或弧存在
适合存储有向图,无向图,有向网,无向网
缺点:
在边稀疏时,浪费存储空间
2.邻接表表示法:
是图的一种链式存储结构,适用于有向图和无向图,对图中每个顶点建立一个单链表,单链表中的结点表示依附于该顶点的边(对有向图来说是以该顶点为弧尾的弧)
有向图:
表结点(链式结构存储):
adjvex:指示与vi邻接的顶点在图中的位置
nextarc:指示下一条边或弧的结点
info:存储和边或弧有关的信息(如权值)
头结点(顺序结构存储):
data:存储顶点名称和其他相关信息
firstarc:指向链表中第一个结点
vi的出度 = 第i个单链表中的结点数目
vi的入度 = 遍历整个邻接表中其邻接点值域为i的结点个数
有时,为了便于确定顶点的入度或以顶点vi的弧,可以对每个顶点vi建立一个链接以vi为弧头的表——逆邻接表
无向图:
若无向图有n个顶点,e条边,则它的邻接表需要n个头结点和2e个表结点(边稀疏时比邻接矩阵省空间)
顶点vi的度TD=第i个单链表中的结点数目
六条边用了十二个表结点——建立邻接多重表
优点:易找到任一顶点的第一个邻接点和下一个邻接点,适合存储有向图(网),无向图(网)
缺点:难以直接判定任意两个顶点之间是否有边或者弧相连,需搜索第i和第j个单链表,不及邻接矩阵方便
图的另外两种不常用的存储形式
1.十字链表——有向图
2.邻接多重表——无向图
十字链表:
是有向图的一种存储结构,可看成有向图的邻接表与逆邻接表结合的一种链表
头结点: 、
data:存储和顶点相关的信息
firstin:指向以该顶点为弧头的第一个弧结点
firstout:指向以该顶点为弧尾的第一个弧结点
弧结点: 、
info:存储弧的相关信息
tailvex:指示弧尾在图中的位置
headvex:指示弧头在图中的位置
hlink:指向弧头相同的下一条弧
tlink:指向弧尾相同的下一条弧
邻接多重表:
是无向图的一种链式存储结构,每条边用一个结点表示,与邻接表表示方法的区别在于:邻接表中用两个结点表示一条边;在邻接多重表中用一个结点表示一条边
头结点: 、
data:存储和该顶点有关的信息
firstedge:指示第一条依附于该顶点的边
边结点:
mark:边结点的标志域,可用于标识该条边是否被访问过
info:指向和边有关的信息的指针域
ivex和jvex:为该边依附的两个顶点在图中的位置
ilink:指向依附于顶点ivex的边
jlink:指向依附于顶点jvex的边
邻接多重表各种基本操作的实现和邻接表类型