图 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                      

 

posted on 2018-11-11 10:51  MACHINE_001  阅读(271)  评论(0编辑  收藏  举报

导航