圖->存儲結構->數組表示法(鄰接矩陣)


文字描述

  用兩個數組分別存儲頂點信息和邊/弧信息。

示意圖

算法分析

  構造一個采用鄰接矩陣作存儲結構、具有n個頂點和e條邊的無向網(圖)G的時間復雜度是(n*n + e*n), 其中對鄰接矩陣G.arcs的初始化耗費了n*n的時間。

  借助於鄰接矩陣容易判定兩個頂點之間是否有邊/弧相連,並容易求得各個頂點的度。對於無向圖,頂點vi的度是鄰接矩陣地i行(或第i列)的元素之和;對於有向圖,第i行的元素之和為頂點vi的出度;第j列的元素之和為頂點vj的入度;

代碼實現

 

  1 /*
  2     以數組表示法(鄰接矩陣)作為圖的存儲結構創建圖。
  3 */
  4 #include <stdio.h>
  5 #include <stdlib.h>
  6 #include <string.h>
  7 
  8 #define INFINITY        100000    //最大值
  9 #define MAX_VERTEX_NUM    20        //最大頂點數
 10 typedef enum {DG, DN, UDG, UDN} GraphKind; //{有向圖,有向網,無向圖,無向網}
 11 typedef int  VRType;
 12 typedef char VertexType;
 13 typedef struct{
 14     char note[10];
 15 }InfoType;
 16 typedef struct ArcCell{
 17     VRType adj;        //頂點關系類型:1)對無權圖,用1或0表示相鄰否;2)對帶權圖,則為權值類型
 18     InfoType *info;    //該弧相關信息的指針
 19 }ArcCell, AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
 20 typedef struct{
 21     VertexType vexs[MAX_VERTEX_NUM];    //頂點向量
 22     AdjMatrix arcs;        //鄰接矩陣
 23     int vexnum, arcnum;    //圖的當前頂點數和弧數
 24     GraphKind kind;        //圖的種類標志
 25 }MGraph;
 26 
 27 /*
 28     若G中存在頂點u,則返回該頂點在圖中位置;否則返回-1。
 29 */
 30 int LocateVex(MGraph G, VertexType v){
 31     int i = 0;
 32     for(i=0; i<G.vexnum; i++){
 33         if(G.vexs[i] == v){
 34             return i;
 35         }
 36     }
 37     return -1;
 38 }
 39 
 40 /*
 41     采用數組表示法(鄰接矩陣),構造無向網
 42 */
 43 int CreateUDN(MGraph *G){
 44     int i = 0, j = 0, k = 0, IncInfo = 0;
 45     int v1 = 0, v2 = 0, w = 0;
 46     char tmp[10] = {0};
 47 
 48     printf("輸入頂點數,弧數,其他信息標志位: ");
 49     scanf("%d,%d,%d", &G->vexnum, &G->arcnum, &IncInfo);
 50 
 51     for(i=0; i<G->vexnum; i++){
 52         printf("input vexs %d: ", i+1);
 53         memset(tmp, 0, sizeof(tmp));
 54         scanf("%s", tmp);
 55         G->vexs[i] = tmp[0];
 56     }
 57     for(i=0; i<G->vexnum; i++){
 58         for(j=0; j<G->vexnum; j++){
 59             G->arcs[i][j].adj = INFINITY;
 60             G->arcs[i][j].info = NULL;
 61         }
 62     }
 63     for(k=0; k<G->arcnum; k++){
 64         printf("輸入第%d條弧: 頂點1, 頂點2,權值", k+1);
 65         memset(tmp, 0, sizeof(tmp));
 66         scanf("%s", tmp);
 67         sscanf(tmp, "%c,%c,%d", &v1, &v2, &w);
 68         i = LocateVex(*G, v1);
 69         j = LocateVex(*G, v2);
 70         G->arcs[i][j].adj = w;
 71         if(IncInfo){
 72             //
 73         }
 74         G->arcs[j][i] = G->arcs[i][j];
 75     }
 76     return 0;
 77 }
 78 
 79 /*
 80     采用數組表示法(鄰接矩陣),構造無向圖
 81 */
 82 int CreateUDG(MGraph *G)
 83 {
 84     int i = 0, j = 0, k = 0, IncInfo = 0;
 85     int v1 = 0, v2 = 0, w = 0;
 86     char tmp[10] = {0};
 87 
 88     printf("輸入頂點數,弧數,其他信息標志位: ");
 89     scanf("%d,%d,%d", &G->vexnum, &G->arcnum, &IncInfo);
 90 
 91     for(i=0; i<G->vexnum; i++){
 92         printf("輸入第%d個頂點: ", i+1);
 93         memset(tmp, 0, sizeof(tmp));
 94         scanf("%s", tmp);
 95         G->vexs[i] = tmp[0];
 96     }
 97     for(i=0; i<G->vexnum; i++){
 98         for(j=0; j<G->vexnum; j++){
 99             G->arcs[i][j].adj = 0;
100             G->arcs[i][j].info = NULL;
101         }
102     }
103     for(k=0; k<G->arcnum; k++){
104         printf("輸入第%d條弧(頂點1, 頂點2): ", k+1);
105         memset(tmp, 0, sizeof(tmp));
106         scanf("%s", tmp);
107         sscanf(tmp, "%c,%c", &v1, &v2, &w);
108         i = LocateVex(*G, v1);
109         j = LocateVex(*G, v2);
110         G->arcs[i][j].adj = 1;
111         if(IncInfo){
112             //
113         }
114         G->arcs[j][i] = G->arcs[i][j];
115     }
116     return 0;
117 }
118 
119 /*
120     采用數組表示法(鄰接矩陣),構造圖
121 */
122 int CreateGraph(MGraph *G)
123 {
124     printf("輸入圖類型: -有向圖(0), -有向網(1), +無向圖(2), +無向網(3): ");
125     scanf("%d", &G->kind);
126     switch(G->kind){
127         case DG://構造有向圖
128         case DN://構造有向網
129             printf("還不支持!\n");
130             return -1;
131         case UDG://構造無向圖
132             return CreateUDG(G);
133         case UDN://構造無向網
134             return CreateUDN(G);
135         default:
136             return -1;
137     }
138 }
139 
140 /*
141     輸出圖的信息
142 */
143 void printG(MGraph G)
144 {
145     if(G.kind == DG){
146         printf("類型:有向圖;頂點數 %d, 弧數 %d\n", G.vexnum, G.arcnum);
147     }else if(G.kind == DN){
148         printf("類型:有向網;頂點數 %d, 弧數 %d\n", G.vexnum, G.arcnum);
149     }else if(G.kind == UDG){
150         printf("類型:無向圖;頂點數 %d, 弧數 %d\n", G.vexnum, G.arcnum);
151     }else if(G.kind == UDN){
152         printf("類型:無向網;頂點數 %d, 弧數 %d\n", G.vexnum, G.arcnum);
153     }
154     int i = 0, j = 0;
155     printf("\t");
156     for(i=0; i<G.vexnum; i++){
157         printf("%c\t", G.vexs[i]);
158     }
159     printf("\n");
160     for(i=0; i<G.vexnum; i++){
161         printf("%c\t", G.vexs[i]);
162         for(j=0; j<G.vexnum; j++){
163             if(G.arcs[i][j].adj == INFINITY){
164                 printf("INF\t");
165             }else{
166                 printf("%d\t", G.arcs[i][j].adj);
167             }
168         }
169         printf("\n");
170     }
171 }
172 
173 int main(int argc, char *argv[])
174 {
175     MGraph G;
176     if(CreateGraph(&G) > -1)
177         printG(G);
178     return 0;
179 }
鄰接矩陣存儲結構(圖)

 

 

 

代碼運行

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM