【数据结构算法】图(三):存储结构(邻接表,十字链表,邻接多重表,边集矩阵)

由于邻接矩阵这种存储结构存在一定空间浪费,因此考虑用邻接表

邻接表

这是一种数组与链表结合一起来存储。

无向图

【数据结构算法】图(三):存储结构(邻接表,十字链表,邻接多重表,边集矩阵)

有向图(把顶点当弧尾)

【数据结构算法】图(三):存储结构(邻接表,十字链表,邻接多重表,边集矩阵)

有向图(把顶点当弧头)【这种叫做逆邻接表】

【数据结构算法】图(三):存储结构(邻接表,十字链表,邻接多重表,边集矩阵)


十字链表

邻接表固然优秀,但也有不足的地方,比如对有向图的处理的时候,有时需要建立逆邻接表。
十字链表将邻接表和逆邻接表整合在一起。
十字链表虽然结构复杂,但其创建图的时间复杂度和邻接表是相同的。
【数据结构算法】图(三):存储结构(邻接表,十字链表,邻接多重表,边集矩阵)


邻接多重表

邻接表固然优秀,但也有不足的地方,比如对无向图的处理的时候,重点关注的顶点,但要是重点关注边的时候,比如对已经访问过的边做标记或者删除某一条边的时候(这种时候要做好几步操作,因为某条边可能会在很多线性表中出现,如下图),就不是那么方便了。就要考虑邻接多重表。
【数据结构算法】图(三):存储结构(邻接表,十字链表,邻接多重表,边集矩阵)
邻接多重表的特点:
【数据结构算法】图(三):存储结构(邻接表,十字链表,邻接多重表,边集矩阵)
【数据结构算法】图(三):存储结构(邻接表,十字链表,邻接多重表,边集矩阵)


边集矩阵

有向图

【数据结构算法】图(三):存储结构(邻接表,十字链表,邻接多重表,边集矩阵)