圖 ADT介面 遍歷運算 常規運算 鄰接矩陣實現
阿新 • • 發佈:2018-11-11
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