圖的存儲結構

圖的存儲結構相比較線性表與樹來說就複雜很多。
對於線性表來說,是一對一的關係,所以用數組或者鏈表均可簡單存放。樹結構是一對多的關係,所以我們要將數組和鏈表的特性結合在一起才能更好的存放。
圖,是多對多的情況,另外圖上的任何一個頂點都可以被看作是第一個頂點,任一頂點的鄰接點之間也不存在次序關係。

因爲任意兩個頂點之間都可能存在聯繫,因此無法以數據元素在內存中的物理位置來表示元素之間的關係(內存物理位置是線性的,圖的元素關係是平面的)。

鄰接矩陣(無向圖)

無向圖鄰接矩陣的特性
鄰接矩陣是對稱方陣;
對於頂點vi,其度數是第i行的非0元素的個數;
無向圖的邊數是上(或下)三角形矩陣中非0元素個數。
無向圖的鄰接矩陣中非零元個數 = 2*無向圖邊數
有了這個二維數組組成的對稱矩陣,我們就可以很容易地知道圖中的信息:
要判定任意兩頂點是否有邊無邊就非常容易了;
要知道某個頂點的度,其實就是這個頂點Vi在鄰接矩陣中第i行(或第i列)的元素之和;

鄰接矩陣(有向圖)

對有向圖可以建立正鄰接表或逆鄰接表。正鄰接表是以頂點Vi爲出度(即爲弧的起點)而建立的鄰接表;逆鄰接表是以頂點Vi爲入度(即爲弧的終點)而建立的鄰接表;
◆ 在有向圖中,第i個鏈表中的結點數是頂點Vi的出 (或入)度;求入 (或出)度,須遍歷整個鄰接表

鄰接矩陣(網)

在圖的術語中,我們提到了網這個概念,事實上也就是每條邊上帶有權的圖就叫網。

十字鏈表法
十字鏈表(Orthogonal List)是有向圖的另一種鏈式存儲結構,是將有向圖的正鄰接表和逆鄰接表結合起來得到的一種鏈表。
在這種結構中,每條弧的弧頭結點和弧尾結點都存放在鏈表中,並將分別組織到以弧尾結點爲頭(頂點)結點和以弧頭結點爲頭(頂點)結點的鏈表中。

鄰接多重表(Adjacency Multilist)
鄰接多重表(Adjacency Multilist)是無向圖的另一種鏈式存儲結構。
在無向圖的鄰接表中,一條邊(v,w)的兩個表結點分別被選在以v和w爲頭結點的鏈表中。如果關注的重點是頂點,則鄰接表是不錯的選擇,但在涉及到邊的操作會帶來不便。
鄰接多重表的結構和十字鏈表類似,每條邊用一個結點表示;鄰接多重表中的頂點結點與鄰接表中的完全相同
Data域:存儲和頂點相關的信息;
firstedge:指向依附於該頂點的第一條邊所對應的表結點;
mark:用以標識該條邊是否被訪問過;
ivex和jvex:分別保存該邊所依附的兩個頂點在頂點表中的下標;
info域:保存該邊的相關信息;
ilink:指向依附於頂點ivex的下一條邊;
jlink:指向依附於頂點jvex的下一條邊;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章