图的存储结构——邻接表法
对于边数相对顶点较少的图,用邻接矩阵法会对存储空间造成极大的浪费。如下图:
邻接矩阵除了arc[1] [0]有权值外,没有其他弧,其实这些存储空间都浪费掉了。
对于这种结构,我们可以使用数组与链表相结合的存储方法,称为邻接表。
邻接表的处理方法如下:
-
图中顶点用一个一维数组存储。对于顶点数组中,每个数据元素还需要存储指向第一个邻接点的指针,以便于查找该顶点边的信息。
-
图中每个顶点vi的所有邻接点构成表,由于邻接点的个数不定,所以用单链表存储,无向图称为顶点vi的边表,有向图则成为vi作为弧尾的出边表。
-
顶点表的各个节点由data和firstedge两个域表示,data是数据域,存储顶点的信息,firstedge是指针域,指向边表的第一个结点,即此顶点的第一个邻接点。
-
边表结点由adjvex和next两个域组成。adjvex是邻接点域,存储顶点的邻接点在顶点表中的下标,next则存储指向边表的下一个结点的指针。
①无向图的邻接表
如下图的邻接表为:
②有向图的邻接表
如下图的邻接表为:
以顶点为弧尾来存储边表,这样可以很容易得到每个顶点的出度。
③有向图的逆邻接表
如上图的逆邻接表为:
逆邻接表是以弧头为顶点来存储边表,这样很容易得到每个顶点的入度。
④网图的邻接表
对于带权的网图,可以在边表结点定义中再增加一个weight的数据域,存储权值信息即可。
如下图的网图的邻接表为: