圖 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                      
相關文章
相關標籤/搜索