zoukankan      html  css  js  c++  java
  • 数据结构--实验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 ("
      请输入 %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 条无向带权边
    ", 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("
    ");
     69     }
     70 
     71 }
     72 
     73 void main()
     74 {
     75     vexlist GV;
     76     adjmatrix GA;
     77     int i,k,j;
     78     do 
     79     {
     80     printf("
    
    
    
    ");
     81     printf("		      图的邻接矩阵子系统
    ");
     82     printf("		*****************************
    ");
     83     printf("		*       1----更 新 图     *
    ");
     84     printf("		*       2----深度遍历    *
    ");
     85     printf("		*       3----广度遍历    *
    ");
     86     printf("		*       0----返  回    *
    ");
     87     printf("		*****************************
    ");
     88     printf("		   请选择菜单项(0-3):");
     89     scanf("%d",&k);
     90     switch(k)
     91     {
     92         case 1:
     93             printf ("
    请输入图的顶点的个数n= ");
     94                    scanf("%d",&n);                
     95             printf ("请输入图的边个数e= ");
     96                   scanf("%d",&e); 
     97                   Create(GV,GA,n,e);
     98             printf("图的邻接矩阵如下
    ");
     99             print(GA);
    100             break;
    101         case 2:
    102             for (i=0; i< MaxVertexNum;  i++)       /*标志向量初始化*/
    103             visited [i]=0; 
    104             printf ("
    请输入从图的哪个顶点(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 ("
    请输入从图的哪个顶点(1-%d)开始广度遍历:",j);
    113               scanf("%d",&j);
    114             printf("广度遍历的结果为:");
    115              bfs(GV,GA,j);
    116             break;
    117     }     
    118     }while (k!=0);
    119 }
    不经一番彻骨寒,哪有梅花扑鼻香?
  • 相关阅读:
    java中tif转png
    HTTP服务器、WEB服务器、应用服务器
    word将编号转成普通文本
    浏览新闻常用单词
    手机端搜索的回车事件
    C#(winform)的label自动换行
    oracle for update wait 解析
    java8 新特性parallelStream 修改默认多线程数量
    ArcObjects您必须有许可证才能使用此ActiveX控件
    图灵社区电子书 全高清可编辑 内含多种格式 [珍藏]
  • 原文地址:https://www.cnblogs.com/zongyao/p/13831223.html
Copyright © 2011-2022 走看看