數據結構與算法(16)--圖的存儲結構

圖的存儲結構

圖中頂點沒有次序之分。
圖中邊的頂點的數量是任意的。

  • 鄰接矩陣

    • 頂點
      用一維數組來存儲。
    • 邊或者弧
      用二維數組來存儲。
      a[i][j]a[i][j]
      1:若(vi,vj)(v_i,v_j)E(G)E(G)中的邊
      0:若(vi,vj)(v_i,v_j)不是E(G)E(G)中的邊
      通過看是0還是1來判斷兩個頂點之間是否有邊。
      通過掃描對應的行,把所有的元素加起來就是某個頂點的度。
      通過掃描對應的行,值爲1的頂點爲其鄰接點。
      無向圖的鄰接矩陣是一個對稱矩陣,所以可以只存儲鄰接矩陣的上半部分。
      對於有向圖來說,頂點的入度是頂點所在這一列的各數之和;出度是頂點所在這行的各數之和。
      對於帶權圖可以在矩陣中存儲邊的權值。帶權邊存儲權值,行和列相同結點權值爲0,不存在的邊權值爲無限大。
      #define MaxVertexNum 100 // 頂點數目的最大值
      typedef char VertexType; // 頂點的數據類型 不同情況不一樣
      typedef int EdgeType; // 整數表示權值或者連通性
      typedef struct{
      	VertexType Vex[MaxVertexNum]; // 頂點表
      	EdgeType Edge[MaxVertexNum][MaxVertexNum] // 鄰接矩陣(二維數組),邊表
      	int vexnum,arcnum; // 圖的當前頂點數和弧數
      }MGraph;
      
  • 鄰接表(鏈式存儲)
    圖中的頂點用一個一維數組存儲。同時每個元素還要存儲指向第一個鄰接點的指針(鏈表的頭指針)。存儲頂點和頭指針的表叫做頂點表。
    圖中每個頂點的所有鄰接點構成一個單鏈表。對於無向圖,這個表稱爲該結點的邊表。對於有向圖來說稱爲該結點的出邊表。

    //需要設計兩種結點結構類型:一是頂點表的頂點,一是單鏈表的結點
    typedef struct VNode{ // 頂點表結點
    	VertexType data; // 頂點信息
    	ArcNode *firstedge; // 單鏈表頭指針
    }VNode,AdjList[MaxVertexNum];
    
    #define MaxVertexNum 100 //圖中頂點數目的最大值
    typedef struct ArcNode{ // 邊表結點
    	int adjvex; // 該弧所指向的頂點的位置
    	struct ArcNode *next; // 指向下一條弧的指針
    }ArcNode;
    
    typedef struct{
    	AdjList vertices; // 鄰接表
    	int vexnum,arcnum; //圖的頂點數和弧數
    }ALGraph; //ALGraph是以鄰接表存儲的圖類型
    
    • 十字鏈表(有向圖)
      十字鏈表是針對有向圖的存儲方式,對應於有向圖中的每條弧有一個結點,對應於每個頂點也有一個結點。
      鄰接表存儲的無向圖中查找頂點是比較容易的,但是如果要修改圖中的邊或者是查詢邊,則需要遍歷鏈表。這就是鄰接表的缺陷。
      頂點結點 有三部分

      • data 圖中頂點的數據
      • firstin 該頂點的入邊表的頭指針
      • firstout 該頂點的出邊表的頭指針

      邊表結點有四部分

      • tailvex 這條弧的弧尾(起點)所在頂點表的下標
      • headvex 這條弧的弧頭(終點)所在頂點表的下標
      • headlink 指向弧頭(終點)相同的下一條邊
      • taillink 指向弧尾(起點)相同的下一條邊
        //頂點結點
        typedef struct VNode{
        	VertexType data;
        	ArcNode *firstin, *firstout;
        }VNode;
        //邊表結點
        typedef struct ArcNode{
        	int tailvex,headvex;
        	struct ArcNode *hlink,*tlink;
        };
        typedef struct{
        	VNode xlist[MaxVertexNum]; // 頂點依舊用順序存儲(數組)
        	int vexnum,arcnum; // 圖的頂點數和弧數
        }GLGraph; // 十字鏈表存儲的圖類型
        
        
    • 鄰接多重表(無向圖)
      頂點表與十字鏈表相同,只有後面的邊表不同。
      有四個結點
      其中ivex和jvex爲這條邊依附的兩個頂點在頂點表中的下標
      ilink 指向依附頂點ivex的下一條邊
      jlink 指向依附頂點jvex的下一條邊

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