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 }