1 #include "stdio.h"
2 #define MaxVertexNum 20 //定义图的最大顶点数
3 #define MaxEdgeNum 50 //定义图的最大边数
4 #define MaxValue 1000 //定义MaxValue为全局整型常量,作为无穷大
5 typedef int VertexType; //定义图中顶点数据的类型VertexType为整型
6 typedef VertexType vexlist[MaxVertexNum]; //为存储顶点信息的数组类型
7 typedef int adjmatrix[MaxVertexNum][MaxVertexNum]; //为存储邻接矩阵的数组类型
8 int n; //实际的顶点个数
9 int e; //实际的边个数
10 int visited [ MaxVertexNum ]; //全局数组标记置1表示已经访问,0为未访问
11 /* 建立图的邻接矩阵
12 通过从键盘上输入n个顶点信息和e条无向带权边的信息,建立邻接矩阵GA*/
13 void Create(vexlist GV,adjmatrix GA,int n,int e)
14 {
15 int i , j, k, w;
16 printf ("\n 请输入 %d 个顶点数据", n); //建立顶点数组
17 for (i=1; i<=n; i++) GV[i]=i;
18 for (i=1; i<=n; i++) /*初始化邻接矩阵数组*/
19 for (j=1; j<=n; j++)
20 GA[ i ][ j ]=MaxValue;
21 printf ("输入 %d 条无向带权边\n", e); /*建立邻接矩阵数组*/
22 for (k=1; k<=e; k++)
23 {
24 printf("输入第 %d 条边的两端序号及权值(i j W): ",k);
25 scanf ("%d%d%d", &i, &j, &w);
26 GA[i][j]=GA[j][i]=w; //置数组中相应对称元素的值为w
27 }
28 }
29
30 //邻接矩阵的深度遍历
31 void dfs(vexlist GV,adjmatrix GA,int i) // 从顶点i出发的深度遍历
32 { int j;
33 printf("%d,",GV[i]); //输出访问顶点
34 visited[i]=1; //全局数组访问标记置1表示已经访问
35 for(j=1; j<=n; j++)
36 if ((GA[i][j]!=MaxValue)&&(!visited[j]))
37 dfs(GV,GA,j);
38 }
39
40 //邻接矩阵的广度遍历
41 void bfs(vexlist GV,adjmatrix GA,int i) //从顶点i出发广度遍历
42 { int q[MaxVertexNum] ; //Q为队列
43 int f,r,j ; // f,r分别为队列头,尾指针
44 f=r=0 ; //设置空队列
45 printf("%d,",GV[i]); // 输出访问顶点
46 visited[i]=1; //全局数组标记置1表示已经访问
47 r++; q[r]=i ; //入队列
48 while (f<r)
49 { f++; i=q[f] ; //出队列
50 for (j=1; j<=n; j++)
51 if ((GA[i][j]!=MaxValue)&&(!visited[j]))
52 { printf("%d,",GV[j]);
53 visited[j]=1 ;
54 r++; q[r]=j;
55 }
56 }
57 }
58
59 void print(adjmatrix GA)
60 {
61
62 int i,j;
63 for(i=1;i<=n;i++)
64 {
65 for(j=1;j<=n;j++)
66
67 printf("%d ",GA[i][j]);
68 printf("\n");
69 }
70
71 }
72
73 void main()
74 {
75 vexlist GV;
76 adjmatrix GA;
77 int i,k,j;
78 do
79 {
80 printf("\n\n\n\n");
81 printf("\t\t 图的邻接矩阵子系统\n");
82 printf("\t\t*****************************\n");
83 printf("\t\t* 1----更 新 图 *\n");
84 printf("\t\t* 2----深度遍历 *\n");
85 printf("\t\t* 3----广度遍历 *\n");
86 printf("\t\t* 0----返 回 *\n");
87 printf("\t\t*****************************\n");
88 printf("\t\t 请选择菜单项(0-3):");
89 scanf("%d",&k);
90 switch(k)
91 {
92 case 1:
93 printf ("\n请输入图的顶点的个数n= ");
94 scanf("%d",&n);
95 printf ("请输入图的边个数e= ");
96 scanf("%d",&e);
97 Create(GV,GA,n,e);
98 printf("图的邻接矩阵如下\n");
99 print(GA);
100 break;
101 case 2:
102 for (i=0; i< MaxVertexNum; i++) /*标志向量初始化*/
103 visited [i]=0;
104 printf ("\n请输入从图的哪个顶点(1-%d)开始深度遍历:",j);
105 scanf("%d",&j);
106 printf("深度遍历的结果为:");
107 dfs(GV,GA,j);
108 break;
109 case 3:
110 for (i=0; i< MaxVertexNum; i++) /*标志向量初始化*/
111 visited [i]=1;
112 printf ("\n请输入从图的哪个顶点(1-%d)开始广度遍历:",j);
113 scanf("%d",&j);
114 printf("广度遍历的结果为:");
115 bfs(GV,GA,j);
116 break;
117 }
118 }while (k!=0);
119 }