数据结构基础之图的存储结构

来源:互联网 发布:java中的scanner 编辑:程序博客网 时间:2024/05/20 22:36

图的结构比较复杂,任意两个顶点之间都可能存在联系,因此无法以数据元素在内存中的物理位置来表示元素之间的关系,换句话说就是图不可能用简单的顺序存储结构来表示。而使用多重链表的方式,即以一个数据域和多个指针域组成的结点表示图中的一个顶点,尽管这样可以实现图的结构,但是如果各个顶点的度数相差很大,按度数最大的顶点设计结点结构会造成很大存储单元的浪费,而若按照每个顶点自己的度数设计不同的顶点结构,又带来操作不便。一般,通过以下介绍的五种存储结构来解决图的存储
1, 邻接矩阵。用两个数组来表示图。一个一维数组存储图中顶点信息,一个二维数组(称为邻接矩阵)存储图中的边或弧的信息。
2,邻接表。对于边数相对顶点数少的图,邻接矩阵存在对于存储空间的浪费,其产生的邻接矩阵就会是一个稀疏数组。对边或弧使用链式存储的方式就可以避免浪费的问题。这种数组与链表结合的存储方法就称为邻接表。
3,十字链表。对于有向图来说,邻接表是存在缺陷的,关心了出度问题就不能了解入度的情况,两者只得其一。把它们整合在一起的方法就是十字链表法。我们重新定义顶点表结点结构如下所示:
data firstIn firstOut
firstIn:入边表头指针,指向该顶点的入边表中第一个结点
firstOut:出边表头指针,指向该顶点的出边表的第一个结点
边表结点结构:
tailvex headvax headlink taillink
Tailvex:弧起点在顶点表的下标
Headvax:弧起点在终点表的下标
Headlink:入边表指针域,指向终点相同的下一条边
Taillink:出边表指针域,指向起点相同的下一条边

4,邻接多重表
ivex ilink jvex jlink
Ivex和jvex是与某条边依附的两个顶点在顶点表中的下标。Ilink指向依附顶点ivex的下一条边,jlink指向依附顶点jvex的下一条边。如果更关注边的操作,比如对已经访问过的边做标记,删除某一条边等的操作那么邻接多重表是很好的选择。
5,边集数组
边集数组是由两个一维数组构成。一个是存储顶点的信息;另一个是存储边的信息,这个边数组每个数据元素由一条边的起点下标,终点下标和权组成

0 0
原创粉丝点击