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