图的数据结构

来源:互联网 发布:ubuntu wifi 编辑:程序博客网 时间:2024/06/15 18:42

无论是有向图还是无向图,最常用的两种存储结构:邻接矩阵和邻接链表。前者是顺序存储,后者是链式存储。

(1)邻接矩阵

邻接矩阵用一个一维数组存储顶点的信息,用一个二位数组存储图中边的信息。

优缺点:实现简单,但是当图为稀疏图时浪费空间。

(2)邻接表

邻接表中包括两种结点:顶点结点和边结点。

顶点结点中:data顶点域。firstarc域,用于指向第一条邻接边。

边结点中包括:adjvex邻接点域。nextarc指针域,指向下一条邻边。

优缺点:

邻接表相对于邻接矩阵如果是边稀疏图的话比较节约空间。但是邻接表要确定Vi和Vj是否有边的时候没有邻接矩阵方便。



拓展:

(1)十字链表

 十字链表是链式存储,但是只能用于有向图。相比于邻接表,它的顶点结点和边结点的结构不同:

顶点结点中包括:data域存放顶点相关的数据信息,firstin和firstout两个域分别指向以该顶点为弧头和弧尾的第一个弧结点。

弧结点中包括:tailvex尾域和headvex头域分别指向弧尾和弧头这两个顶点的位置,链域hlink指向弧头相同的下一条弧,链域tlink指向弧尾相同的下一条弧,info域包括弧相关的信息。

优缺点:在十字链表中容易找到Vi的尾的弧,也容易找到以Vi为头的弧,因而容易求得顶点的出度和入度。

(2)邻接多重表

邻接多重表也是链式存储,但是仅能用于无向图。相比于邻接表,它的顶点结点和边结点的结构有所不同:

邻接多重表顶点结点的结构和邻接表相同:data域存储该顶点的信息,firestedge域指向第一条依附于该顶点的边。

弧结点中包括:mark域为标志位,用于标记该条边是否被搜索过。ivex和jvex为该边依附的两个顶点的位置。ilink指向下一条依附于ivex的边,jlink指向下一条依附于jvex的边,info为指向和边相关的各种信息的指针域。

优缺点:方便于边的搜索和边的删除。




原创粉丝点击