邻接矩阵:图的静态数组存储法
邻接表:稀疏图的链式存储法
十字链表:有向图的链式存储法
邻接多重表:无向图的链式存储法
邻接矩阵
构成
邻接表表示法:数组表示法(静态)
两个数组:顺序表、邻接矩阵
顺序表:存储顶点信息的一维数组
邻接矩阵:存储图中顶点之间关联关系的二维数组
无权图的邻接矩阵
例1:邻接矩阵
例2:邻接矩阵
网的邻接矩阵
例3:邻接矩阵
图的存储举例
邻接矩阵的特点
(1) 存储空间
无向图的邻接矩阵对称,可压缩存储;有n个顶点的无向图需为n(n+1)/2个存储空间。
有向图邻接矩阵不一定对称;有n个顶点的有向图需为n²个存储空间。
(2) 便于计算
① 判断任意两个顶点是否相邻:Aij=0、Aij=1、Aij=∞、 Aij≠∞。
② 计算顶点的度:
无向图中顶点Vi的度就是邻接矩阵中第i行元素之和。
有向图中,顶点Vi的出度是邻接矩阵中第i行元素之和,顶点Vi的入度是邻接矩阵中第i列元素之和。
③ 便于实现图的一些基本操作,如计算顶点v的第一个邻接点:在顺序表找到v的下标i,在邻接矩阵第i行中找到第一个邻接点下标j,从顺序表中取的第一个邻接点的信息。
邻接矩阵的缺点
(1) 建立存储结构时,必须知道顶点的个数
(2) 顶点的插入和删除效率非常低
(3) 对于稀疏图而言,存储空间浪费严重
邻接表
构成
顺序表:即表头结点表(顶点结点表)
边表:即边链表
邻接表方法:是一种顺序和链式存储相结合的方法。边表只存储关联信息。
例1:下图的邻接表表示法
结点的存储结构
例2:下图的邻接表表示法
例3:下图的邻接表表示法
邻接表的特点
(1) 存储空间
无向图n个顶点、e条边,存储空间为:n个表头结点+2e个边结点。
有向图n个顶点、e条弧,存储空间为:n个表头结点+e个弧结点。
当为稀疏图时,e很小,节约空间。
(2) 无向图的度
vi的度=顺边链i计数
(3) 有向图的出度、入度
vi的出度=顺边链i计数
vi的入度:遍历边表
vi的入度=对逆邻接表顺边链i计数
(4) vi与vj是否相邻:遍历边表
例4:有向图的邻接表和逆邻接表表示法
十字链表
十字链表的组成
十字链表:将有向图的邻接表和逆邻接表结合在一起得到的。由弧结点组成。
顺序表:存储顶点信息的一维数组。由顶点结点组成。
十字链表的顶点结点
数据域data:顶点信息
链域firstin:用于指向以该顶点作为弧头的第一个弧结点,相当逆邻接表的头指针
链域firstout:用于指向以该顶点作为弧尾的第一个弧结点,相当于邻接表的头指针
十字链表的弧结点
位置域tailvex:表示弧尾顶点位置号
位置域headvex:表示弧头顶点位置号
链域hlink:指向与此弧的弧头相同的下一条弧,相当逆邻接表的下一弧结点
链域tlink:指向与此弧的弧尾相同的下一条弧,相当邻接表的下一弧结点
info:指向该弧的相关信息
例:有向图的十字链表表示法
邻接多重表
邻接多重表的组成
邻接多重表:将无向图的边(vi,vj)和边(vj,vi)合而为一,用一个边结点表示。
顺序表:存储顶点信息的一维数组,由顶点结点组成。
邻接多重表的顶点结点
数据域data:顶点信息
链域firstedge:用于指向第一条依附于该顶点的边,即指向边结点
邻接多重表的边结点
标志域mark:可用于该条边是否被搜索过
位置域ivex、jvex:边依附的两个顶点的位置
链域ilink:用于指向下一条依附于顶点ivex的边
链域jlink:用于指向下一条依附于顶点jvex的边
info:指向该弧的相关信息
例:下图的邻接多重表表示法
欢迎大家加我微信交流讨论(请备注csdn上添加)