數據結構基礎(20) --圖的存儲結構

圖的結構定義

    圖是由一個頂點集 V 和一個弧集 E構成的數據結構。

     Graph = (V , E )

   其中,E = {<v,w>| v,w∈V 且 P(v,w)} <v,w>表示從 v 到 w 的一條弧,並稱 v 爲弧尾,w 爲弧頭。謂詞 P(v,w) 定義了弧 <v,w>的意義或信息。

   由頂點集和邊集構成的圖稱作無向圖。

   如果”弧”是有方向的,則稱由頂點集和弧集構成的圖爲有向圖。

 

鄰接矩陣

 

  定義:矩陣的元素爲

 有向圖的鄰接矩陣爲非對稱矩陣, 而無向圖的鄰接矩陣爲對稱矩陣;

  1. //無向圖的鄰接矩陣  
  2. const int MAX_VERTS = 20;  
  3. //頂點  
  4. template <typename Type>  
  5. class Vertex  
  6. {  
  7. public:  
  8.     Vertex(const Type &_node = Type())  
  9.         : node(_node) {}  
  10.   
  11. private:  
  12.     Type node;  
  13. };  
  14. //圖  
  15. template <typename Type>  
  16. class Graph  
  17. {  
  18. public:  
  19.     Graph();  
  20.     ~Graph();  
  21.   
  22.     void addVertex(const Type &vertex);  
  23.     void addEdge(int start, int end);  
  24.     void printMatrix();  
  25.   
  26. private:  
  27.     Vertex<Type>* vertexList[MAX_VERTS];  
  28.     int nVerts;  
  29.     int adjMatrix[MAX_VERTS][MAX_VERTS];  
  30. };  

  1. template <typename Type>  
  2. Graph<Type>::Graph():nVerts(0)  
  3. {  
  4.     for (int i = 0; i < MAX_VERTS; ++i)  
  5.         for (int j = 0; j < MAX_VERTS; ++j)  
  6.             adjMatrix[i][j] = 0;  
  7. }  
  8. template <typename Type>  
  9. Graph<Type>::~Graph()  
  10. {  
  11.     for (int i = 0; i < nVerts; ++i)  
  12.         delete vertexList[i];  
  13. }  
  1. template <typename Type>  
  2. void Graph<Type>::addVertex(const Type &vertex)  
  3. {  
  4.     vertexList[nVerts ++] = new Vertex<Type>(vertex);  
  5. }  
  6. template <typename Type>  
  7. void Graph<Type>::addEdge(int start, int end)  
  8. {  
  9.     //無向圖  
  10.     adjMatrix[start][end] = 1;  
  11.     adjMatrix[end][start] = 1;  
  12. }  
  1. template <typename Type>  
  2. void Graph<Type>::printMatrix()  
  3. {  
  4.     for (int i = 0; i < nVerts; ++i)  
  5.     {  
  6.         for (int j = 0; j < nVerts; ++j)  
  7.             cout << adjMatrix[i][j] << ' ';  
  8.         cout << endl;  
  9.     }  
  10. }  


  1. //測試代碼  
  2. int main()  
  3. {  
  4.     Graph<char> g;  
  5.     g.addVertex('A');   //0  
  6.     g.addVertex('B');   //1  
  7.     g.addVertex('C');   //2  
  8.     g.addVertex('D');   //3  
  9.     g.addVertex('E');   //4  
  10.   
  11.     g.addEdge(0, 1);    //A-B  
  12.     g.addEdge(0, 3);    //A-D  
  13.     g.addEdge(1, 0);    //B-A  
  14.     g.addEdge(1, 4);    //B-E  
  15.     g.addEdge(2, 4);    //C-E  
  16.     g.addEdge(3, 0);    //D-A  
  17.     g.addEdge(3, 4);    //D-E  
  18.     g.addEdge(4, 1);    //E-B  
  19.     g.addEdge(4, 2);    //E-C  
  20.     g.addEdge(4, 3);    //E-D  
  21.   
  22.     g.printMatrix();  
  23.   
  24.     return 0;  
  25. }  

鄰接表


注意:在有向圖的鄰接表中不易找到指向該頂點的弧。

  1. //無向圖的鄰接表  
  2. template <typename Type>  
  3. class Graph  
  4. {  
  5. public:  
  6.     Graph(int _size = 10);  
  7.     ~Graph();  
  8.   
  9.     void addVertex(const Type &vertex);  
  10.     void addEdge(int start, int end);  
  11.     void printVertex();  
  12.     void printAdjList();  
  13.   
  14. private:  
  15.     Type *vertexList;  
  16.     list<int> *headNode;  
  17.     int size;  
  18.     int nVertex;  
  19. };  

  1. template <typename Type>  
  2. Graph<Type>::Graph(int _size):size(_size), nVertex(0)  
  3. {  
  4.     vertexList = new Type[size];  
  5.     headNode = new list<int>[size];  
  6. }  
  7. template <typename Type>  
  8. Graph<Type>::~Graph()  
  9. {  
  10.     delete []vertexList;  
  11.     delete []headNode;  
  12. }  
  1. template <typename Type>  
  2. void Graph<Type>::addVertex(const Type &vertex)  
  3. {  
  4.     vertexList[nVertex ++] = vertex;  
  5. }  
  6. template <typename Type>  
  7. void Graph<Type>::addEdge(int start, int end)  
  8. {  
  9.     headNode[start].push_back(end);  
  10. }  
  1. template <typename Type>  
  2. void Graph<Type>::printVertex()  
  3. {  
  4.     cout << vertexList[0];  
  5.     for (int i = 1; i < nVertex; ++i)  
  6.         cout << ' ' << vertexList[i];  
  7.     cout << endl;  
  8. }  
  9. template <typename Type>  
  10. void Graph<Type>::printAdjList()  
  11. {  
  12.     for (int i = 0; i < nVertex; ++i)  
  13.     {  
  14.         cout << i;  
  15.         for (list<int>::iterator iter = headNode[i].begin();  
  16.                 iter != headNode[i].end();  
  17.                 ++iter)  
  18.             cout << " -> " << *iter;  
  19.         cout << endl;  
  20.     }  
  21. }  

  1. //測試代碼  
  2. int main()  
  3. {  
  4.     Graph<char> g;  
  5.     g.addVertex('A');   //0  
  6.     g.addVertex('B');   //1  
  7.     g.addVertex('C');   //2  
  8.     g.addVertex('D');   //3  
  9.     g.addVertex('E');   //4  
  10.     g.printVertex();  
  11.   
  12.     g.addEdge(0, 1);    //A-B  
  13.     g.addEdge(0, 3);    //A-D  
  14.     g.addEdge(1, 0);    //B-A  
  15.     g.addEdge(1, 4);    //B-E  
  16.     g.addEdge(2, 4);    //C-E  
  17.     g.addEdge(3, 0);    //D-A  
  18.     g.addEdge(3, 4);    //D-E  
  19.     g.addEdge(4, 1);    //E-B  
  20.     g.addEdge(4, 2);    //E-C  
  21.     g.addEdge(4, 3);    //E-D  
  22.   
  23.     g.printAdjList();  
  24.   
  25.     return 0;  


原文地址:http://blog.csdn.net/zjf280441589/article/details/42710859

發佈了62 篇原創文章 · 獲贊 16 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章