圖是數據結構裏面的重要一章。通過圖,我們可以判斷兩個點之間是不是具有連通性;通過圖,我們還可以計算兩個點之間的最小距離是多少;通過圖,我們還可以根據不同的要求,尋找不同的合適路徑。當然,有的時候爲了計算的需要,我們還需要從圖中抽象出最小生成樹,這樣在遍歷計算的時候就不需要持續判斷是不是遇到了循環節點。當然,這所有的一切都是從圖的表示開始的。
1)矩陣表示
矩陣表示可以說是最簡單的表示方法,如果說一個圖中有5個點,那麼我們就可以構建一個5*5的矩陣。如果點和點之間存在連接,那麼填上1;反之如果不存在連接,那麼可以用0表示,當然對角線上面的點是沒有意義的。如下圖所示:
- static int graph[5][5] =
- {
- {0, 1, 0, 1, 1},
- {1, 0, 1, 0, 1},
- {0, 1, 0, 1, 0},
- {1, 0, 1, 0, 1},
- {1, 1, 0, 1, 0}
- };
- static int graph[5][5] =
- {
- {0, 0, 0, 0, 0},
- {1, 0, 0, 0, 0},
- {0, 1, 0, 0, 0},
- {1, 0, 1, 0, 0},
- {1, 1, 0, 1, 0}
- };
- static int graph[5][5] =
- {
- {0, 0, 0, 0, 0},
- {3, 0, 0, 0, 0},
- {0, 6, 0, 0, 0},
- {8, 0, 4, 0, 0},
- {9, 2, 0, 7, 0}
- };
2)數組結構
爲了改變矩陣浪費空間的特點,我們可以建立一個只有頂點和邊組成的數據空間。比如說,我們定義一個這樣的結構:
- typedef struct _LINE
- {
- int start;
- int end;
- int weight;
- int isDirection;
- }LINE;
但是,我們還是覺得有遺憾的地方。這個數據結構過分強調了邊的意義和重要性,忽略了頂點本身的含義。因爲,我們在強調邊的時候,應該添加進頂點的相關特性。離開頂點的支持,單純的邊信息是沒有什麼含義的。
3)基於頂點鏈表的圖表示
首先,我們定義頂點的基本結構:
- typedef struct _LINE
- {
- int end;
- int weight;
- struct _LINE* next;
- }LINE;
- typedef struct _VECTEX
- {
- int start;
- int number;
- LINE* neighbor;
- }VECTEX;
- typedef struct _PATH
- {
- int start;
- int end;
- int lenth;
- LINE* next;
- }PATH;
注意事項:
1)數組和鏈表是圖結構的基礎,朋友們應該好好掌握
2)每一種數據結構都有自己的應用場合,關鍵是理解其中的思想和方法
3)圖的表示是圖運算的基礎,掌握它們是我們進一步學習的基本條件