1. 程式人生 > >[數據結構]圖,鄰接多重表,十字鏈表

[數據結構]圖,鄰接多重表,十字鏈表

cells tex div 找到 圖片 gpo ron str 進行

  十字鏈表

  你會發現,要表示一個有向圖,因為有 出度 和 入度 ,需要兩個鄰接表:鄰接表和逆鄰接表。

  其實我們可以把這兩個表整合在一起,也就是十字鏈表(Orthogonal List)。

  我們依然需要構造一種結構體A,用結構體A的數組來存放所有頂點-我們其實可以把它叫做 頂點表。

  我們構造的結構體A如下:

data firstin firstout

  構造結構體B,用結構體B來記錄與這個頂點 用邊鄰接的 頂點的相關信息,我們把它叫做 邊表

tailvex headvex headlink taillink

  在頂點表的每個頂點中,我們用firstin去指向和這個頂點有關的入邊表的第一個元素(指向這個頂點的邊,叫做入邊),叫做入邊表頭指針

  用firstout去指向和這個頂點有關的出邊表的第一個元素(從這個頂點指向別的頂點的邊,叫做出邊),叫做出邊表頭指針

  data用於存放這個頂點的數據。

  在邊表的每個元素中,tailvex是弧的起點在頂點表的數組下標,headvex是弧終點在頂點表的數組下標。headlink(入邊表指針域)指向邊表中和這個元素的弧終點相同的下一個元素,taillink(出邊表指針域)指向邊表中和這個元素的弧起點相同的下一個元素。

  如果是網(每個邊都帶有權值的圖),還可以增加一個weight域來存儲權值。

  舉一個具體的例子如下圖:

技術分享圖片

圖-十字鏈表示例

  V0,V1,V2,V3四個頂點,對應的數組中的下標分別為0,1,2,3。我們也可以看出,五條邊分別為 0-3,1-0,1-2,2-1,2-0(需要考慮方向)。在構造邊表時,你會註意到,對於邊表中的一個元素,它作為某個頂點的出邊時,也一定是對應的另一個頂點的入邊。

  鄰接多重表

  十字鏈表主要用於有向圖。對於無向圖,當我們對這個圖的使用側重於邊的處理時,鄰接多重表是一個更好的選擇。

  我們新建邊表所使用的結構體B 如下:

ivex ilink jvex jlink

  其中ivex,jvex是這條邊所連接的兩個頂點在頂點數組中的下標。ilink指向 ivex的另一條邊,jlink指向 jvex的另一條邊。 或者更機械化的說法,ilink指向的下一個元素的jvex與當前元素的ivex相同。jlink指向的下一個元素的ivex與當前元素的jvex相同。

技術分享圖片

圖-鄰接多重表的示例

  V0,V1,V2,V3四個頂點,對應的數組中的下標分別為0,1,2,3。我們也可以看出,五條邊分別為 0-1,0-2,1-2,2-3,3-0(沒有方向的區別)。

  邊集數組

  還有一種表達方式,邊集數組。

  技術分享圖片

圖-邊集數組的示例

  這種表示方法從結果的展示上來看非常直觀容易理解。但是要找到對應的頂點所有的邊,他需要對數組進行遍歷。所以這種方法,似乎更適合需要對邊進行逐一操作的場合。

未完。

[數據結構]圖,鄰接多重表,十字鏈表