数据结构--实验3--图的操作

  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 }

 

    原文作者:9529
    原文地址: https://www.cnblogs.com/zongyao/p/9255386.html
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞