[數據結構]圖,鄰接多重表,十字鏈表
十字鏈表
你會發現,要表示一個有向圖,因為有 出度 和 入度 ,需要兩個鄰接表:鄰接表和逆鄰接表。
其實我們可以把這兩個表整合在一起,也就是十字鏈表(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(沒有方向的區別)。
邊集數組
還有一種表達方式,邊集數組。
圖-邊集數組的示例
這種表示方法從結果的展示上來看非常直觀容易理解。但是要找到對應的頂點所有的邊,他需要對數組進行遍歷。所以這種方法,似乎更適合需要對邊進行逐一操作的場合。
未完。
[數據結構]圖,鄰接多重表,十字鏈表