1. 程式人生 > >圖 ADT介面 遍歷運算 常規運算 鄰接矩陣實現

圖 ADT介面 遍歷運算 常規運算 鄰接矩陣實現

Graph.h   (圖的結構, 遍歷, 常規操作介面)

 1 /*定義圖的最大定點數, 它要大於等於具體圖的頂點樹n*/
 2 #define MaxVertexNum 12
 3 
 4 /*定義圖的最大邊數,它要大於等於具體圖的邊數e*/
 5 #define MaxEdgeNum 20 
 6 
 7 /* 定義MaxValue 為一個符號常量,其值要大於鄰接矩陣中所有有效值之和*/
 8 #define MaxValue 1000
 9 
10 /*定義MS為一個符號常量,用於廣度優先搜尋遍歷的演算法中,作為自定義順序佇列的陣列長度*/
11 #define MS 20
12 
13 /*定義圖中頂點資料的型別VertexType為整型
*/ 14 typedef int VertextType; 15 16 /*定義vexlist為儲存頂點資訊的陣列型別*/ 17 typedef VertexType vexlist[MaxVertexNum]; 18 19 /*定義adjmatrix 為儲存鄰接矩陣的陣列型別*/ 20 typedef int adjmatrix[MaxVertexNum][MaxVertexNum]; 21 22 /*定義儲存圖頂點訪問標記的陣列*/ 23 int visited[MaxVertexNum]; 24 25 26 27 /*通過從鍵盤上輸入的n個頂點資訊和e條無向帶權邊的資訊建立頂點陣列GV和鄰接矩陣GA
*/ 28 void Create1(vexlist GV, adjmatrix GA, int n, int e); 29 30 /*從初始點Vi出發深度優先搜尋由鄰接矩陣GA表示的圖*/ 31 void dfs1(adjmatrix GA, int i, int n); 32 33 /*從初始點Vi出發廣度優先搜尋由鄰接矩陣GA表示的圖*/ 34 void bfs1(adjmatrix GA, int i, int n);

Graph.c   (圖的介面實現)

 1 void Create1(vexlist GV, adjmatrix GA, int n, int e){
2 /*通過從鍵盤上輸入的n個頂點資訊和e條無向帶權邊的資訊建立頂點陣列GV和鄰接矩陣GA*/ 3 int i,j,k,w; 4 /*建立頂點陣列*/ 5 printf("輸入%d個頂點資料\n", n); 6 for(i = 0; i<n; i++) scanf("%d", &GV[i]); 7 /*初始化鄰接矩陣陣列*/ 8 for(i = 0; i<n; i++) 9 for(j = 0; j<n; j++){ 10 if(i == j)GA[i][j] = 0; 11 else GA[i][j] = MaxValue; 12 } 13 /*建立鄰接矩陣陣列*/ 14 printf("輸入%d條無向帶權邊\n", e); 15 for(k = 1; k<=e; k++){ 16 /*輸入一條邊的兩端點序號i和j及邊上的權w*/ 17 scanf("%d %d %d", &i, &j, &w); 18 /*置陣列中相應對稱元素的值為w*/ 19 GA[i][j] = GA[j][i] = w; 20 } 21 22 } 23 24 25 void dfs1(adjmatrix GA, int i, int n){ 26 /*從初始點Vi出發深度優先搜尋由鄰接矩陣GA表示的圖*/ 27 int j; 28 /*假定訪問頂點Vi以輸出該頂點的序號代之*/ 29 printf("%d",i); 30 /*標記Vi已被訪問過*/ 31 visited[i] = 1; 32 /*依次搜尋Vi的每個鄰接點*/ 33 for(j = 0; j<n; j++) 34 /*若Vi的一個有效鄰接點Vj未被訪問過,則從Vj出發進行遞迴呼叫*/ 35 if(GA[i][j]!=0 && GA[i][j]!=MaxValue && !visited[j]) 36 dfs1(GA, j, n); 37 } 38 39 40 void bfs1(adjmatrix GA, int i, int n){ 41 /*從初始點Vi出發廣度優先搜尋由鄰接矩陣GA表示的圖*/ 42 /*定義一個順序佇列Q,其元素型別應為整形,初始化佇列為空*/ 43 int Q[MS]; //MS是一個事先定義的符號常量 44 int front = 0,rear = 0; 45 /*訪問初始點Vi,同時標記初始點Vi已訪問過*/ 46 printf("%d" ,i); 47 visited[i] = 1; 48 /*將已訪問過的初始點序號i入隊*/ 49 rear = (rear+1)%MS; 50 if(front == rear) { 51 printf("佇列空間用完!\n"); 52 exit(1); 53 } 54 Q[[rear] = i; 55 56 /*當佇列非空時進行迴圈處理*/ 57 while(front != rear){ 58 int j,k; 59 /*刪除隊首元素,第一次執行時k的值為i*/ 60 front = (front + 1)%MS; 61 k = Q[front]; 62 /*依次搜尋Vk的每一個可能的鄰接點*/ 63 for(j = 0; j<n; j++){ 64 if(GA[k][j]!=0 && GA[k][j] != MaxValue&&!visited[j]){ 65 printf("%d", j); //訪問一個未被訪問過的鄰接節點Vj 66 visited[j] = 1; //標記Vj已被訪問過 67 rear = (rear+1)%MS; //修改隊尾指標 68 if(front == rear) { 69 printf("佇列空間用完!\n"); 70 exit(1); 71 } 72 Q[rear] = j; 73 } 74 } 75 76 } 77 } 78