使用邻接矩阵实现的图结构(添加深度优先搜索)

使用邻接矩阵实现的图结构(添加深度优先搜索)
 这次我使用了深度优先搜索。以前的文章如下所示。这个算法困难啊,调试了我好一段时间。下面就是我扩充的深度优先搜索的内容。以前发布的程序有诸多不足,还有几个致命的错误,我就不解释了,这个是优化了的,比以前的好了些。我以前写的图结构:http://student.csdn.net/space.php?uid=999749&do=blog&id=51129

 下面是我的JGraph.h代码:
 

Code:
  1. /*----------------------------------------------------------------------------  
  2. 蒋轶民制作:E-mail:jiangcaiyang123@163.com  
  3. ------------------------------------------------------------------------------  
  4. 文件名:JGraph.h  
  5. ------------------------------------------------------------------------------  
  6. 作用:这是使用邻接矩阵制作的图状结构,基本实现了图的创建操作。  
  7. ------------------------------------------------------------------------------  
  8. 调用规范:无  
  9. /*--------------------------------------------------------------------------*/  
  10. // 条件编译   
  11. #ifndef _JGRAPH_H_   
  12. #define _JGRAPH_H_   
  13. /*--------------------------------------------------------------------------*/  
  14. // 头文件   
  15. #include <limits.h>   
  16.   
  17. // 定义的宏   
  18. #define INFINITY  INT_MAX   
  19. #define MAX_VERTEX_NUM 20   
  20.   
  21. /*--------------------------------------------------------------------------*/  
  22. // 定义一系列类型   
  23. enum GraphKind { DG, DN, UDG, UDN };// 图的类型枚举   
  24. typedef unsigned int VRType;   
  25. typedef char InfoType;   
  26. typedef struct  
  27. {   
  28.  VRType adj;// 顶点关系类型   
  29.  InfoType* info;// 弧的信息   
  30. } AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];   
  31.   
  32. // 图的定义   
  33. template <typename CustomType>   
  34. class JMatrixGraph   
  35. {   
  36. public:   
  37.  JMatrixGraph():vexnum(0),arcnum(0){}// 默认构造函数   
  38.  void CreateGraph( GraphKind inputKind );//创建图   
  39.  void DFSTraverse( bool (*Visit)(int v) );// 深度优先搜索遍历   
  40. private:   
  41.  void CreateDG( void );// 创建有向图   
  42.  void CreateDN( void );// 创建有向网   
  43.  void CreateUDG( void );// 创建无向图   
  44.  void CreateUDN( void );// 创建无向网   
  45.  void DepthFirstSearch( int v, bool (*Visit)(int v) );// 深度优先搜索   
  46.  int FirstAdjVex( int v );// 返回第v个顶点的第一个邻接点   
  47.  int NextAdjVex( int v, int w );// 返回第v个顶点的下一个邻接点   
  48.  CustomType vexs[MAX_VERTEX_NUM];// 顶点向量   
  49.  AdjMatrix arcs;// 邻接矩阵   
  50.  int vexnum, arcnum;// 图的顶点数和弧数   
  51.  GraphKind kind;// 图的种类标志   
  52.  bool visited[MAX_VERTEX_NUM];// 访问标志数组   
  53. };   
  54. /*--------------------------------------------------------------------------*/  
  55. //创建图   
  56. template <typename CustomType>   
  57. void JMatrixGraph<CustomType>::CreateGraph( GraphKind inputKind  )   
  58. {   
  59.  switch ( inputKind )   
  60.  {   
  61.  case DG: return CreateDG();   
  62.  case DN: return CreateDN();   
  63.  case UDG: return CreateUDG();   
  64.  case UDN: return CreateUDN();   
  65.  }   
  66. }   
  67.   
  68. template <typename CustomType>// 创建有向图   
  69. void JMatrixGraph<CustomType>::CreateDG( void )   
  70. {   
  71.  int i, j, k;   
  72.  int v1, v2, incInfo;   
  73.  cout<<"输入顶点个数:/n";   
  74.  cin>>vexnum;   
  75.  cout<<"输入弧的个数:/n";   
  76.  cin>>arcnum;   
  77.  if ( arcnum > vexnum * ( vexnum - 1 ) * 0.5f )   
  78.  {   
  79.   cout<<"输入错误!因为不满足n(n-1)/2的条件。/n";   
  80.   return;   
  81.  }   
  82.  cout<<"输入弧的信息(0表示忽略):/n";   
  83.  cin>>incInfo;   
  84.  for ( i = 0; i < vexnum; i++ )   
  85.  {   
  86.   cout<<"请输入第"<<i+1<<"个顶点的内容:/n";   
  87.   cin>>vexs[i];   
  88.  }   
  89.  for ( i = 0; i < vexnum; i++ )   
  90.  {   
  91.   for ( j = 0; j < vexnum; j++ )   
  92.   {   
  93.    arcs[i][j].adj = 0;   
  94.    arcs[i][j].info = NULL;   
  95.   }   
  96.  }   
  97.  for ( k = 0; k < arcnum; k++ )   
  98.  {   
  99.   cout<<"请输入第"<<k+1<<"边连接的两个顶点。/n";   
  100.   cin>>v1>>v2;   
  101.   arcs[v1-1][v2-1].adj = 1;   
  102.   if ( incInfo != 0 )   
  103.   {   
  104.    cout<<"输入弧的信息,以字符串的形式存储。/n";   
  105.    cin>>arcs[v1-1][v2-1].info;   
  106.   }   
  107.  }// 这里设置断点,下同   
  108. }   
  109.   
  110. template <typename CustomType>// 创建有向网   
  111. void JMatrixGraph<CustomType>::CreateDN( void )   
  112. {   
  113.  int i, j, k;   
  114.  int v1, v2, incInfo;   
  115.  int w;   
  116.  cout<<"输入顶点个数:/n";   
  117.  cin>>vexnum;   
  118.  cout<<"输入弧的个数:/n";   
  119.  cin>>arcnum;   
  120.  if ( arcnum > vexnum * ( vexnum - 1 ) * 0.5f )   
  121.  {   
  122.   cout<<"输入错误!因为不满足n(n-1)/2的条件。/n";   
  123.   return;   
  124.  }   
  125.  cout<<"输入弧的信息(0表示忽略):/n";   
  126.  cin>>incInfo;   
  127.  for ( i = 0; i < vexnum; i++ )   
  128.  {   
  129.   cout<<"请输入第"<<i+1<<"个顶点的内容:/n";   
  130.   cin>>vexs[i];   
  131.  }   
  132.  for ( i = 0; i < vexnum; i++ )   
  133.  {   
  134.   for ( j = 0; j < vexnum; j++ )   
  135.   {   
  136.    arcs[i][j].adj = INFINITY;   
  137.    arcs[i][j].info = NULL;   
  138.   }   
  139.  }   
  140.  for ( k = 0; k < arcnum; k++ )   
  141.  {   
  142.   cout<<"请输入第"<<k+1<<"边连接的两个顶点和权值。/n";   
  143.   cin>>v1>>v2>>w;   
  144.   arcs[v1-1][v2-1].adj = w;   
  145.   if ( incInfo != 0 )   
  146.   {   
  147.    cout<<"输入弧的信息,以字符串的形式存储。/n";   
  148.    cin>>arcs[v1-1][v2-1].info;   
  149.   }   
  150.  }   
  151. }   
  152.   
  153. template <typename CustomType>// 创建无向图   
  154. void JMatrixGraph<CustomType>::CreateUDG( void )   
  155. {   
  156.  int i, j, k;   
  157.  int v1, v2, incInfo;   
  158.  cout<<"输入顶点个数:/n";   
  159.  cin>>vexnum;   
  160.  cout<<"输入弧的个数:/n";   
  161.  cin>>arcnum;   
  162.  if ( arcnum > vexnum * ( vexnum - 1 ) * 0.5f )   
  163.  {   
  164.   cout<<"输入错误!因为不满足n(n-1)/2的条件。/n";   
  165.   return;   
  166.  }   
  167.  cout<<"输入弧的信息(0表示忽略):/n";   
  168.  cin>>incInfo;   
  169.  for ( i = 0; i < vexnum; i++ )   
  170.  {   
  171.   cout<<"请输入第"<<i+1<<"个顶点的内容:/n";   
  172.   cin>>vexs[i];   
  173.  }   
  174.  for ( i = 0; i < vexnum; i++ )   
  175.  {   
  176.   for ( j = 0; j < vexnum; j++ )   
  177.   {   
  178.    arcs[i][j].adj = 0;   
  179.    arcs[i][j].info = NULL;   
  180.   }   
  181.  }   
  182.  for ( k = 0; k < arcnum; k++ )   
  183.  {   
  184.   cout<<"请输入第"<<k+1<<"边连接的两个顶点。/n";   
  185.   cin>>v1>>v2;   
  186.   arcs[v1-1][v2-1].adj = 1;   
  187.   cout<<"该元素的值是:"<<arcs[v1-1][v2-1].adj;   
  188.   if ( incInfo != 0 )   
  189.   {   
  190.    cout<<"输入弧的信息,以字符串的形式存储。/n";   
  191.    cin>>arcs[v1-1][v2-1].info;   
  192.   }   
  193.   arcs[v2-1][v1-1].adj = arcs[v1-1][v2-1].adj;   
  194.  }   
  195. }   
  196.   
  197. template <typename CustomType>// 创建无向网   
  198. void JMatrixGraph<CustomType>::CreateUDN( void )   
  199. {   
  200.  int i, j, k;   
  201.  int v1, v2, incInfo;   
  202.  int w;   
  203.  cout<<"输入顶点个数:/n";   
  204.  cin>>vexnum;   
  205.  cout<<"输入弧的个数:/n";   
  206.  cin>>arcnum;   
  207.  if ( arcnum > vexnum * ( vexnum - 1 ) * 0.5f )   
  208.  {   
  209.   cout<<"输入错误!因为不满足n(n-1)/2的条件。/n";   
  210.   return;   
  211.  }   
  212.  cout<<"输入弧的信息(0表示忽略):/n";   
  213.  cin>>incInfo;   
  214.  for ( i = 0; i < vexnum; i++ )   
  215.  {   
  216.   cout<<"请输入第"<<i+1<<"个顶点的内容:/n";   
  217.   cin>>vexs[i];   
  218.  }   
  219.  for ( i = 0; i < vexnum; i++ )   
  220.  {   
  221.   for ( j = 0; j < vexnum; j++ )   
  222.   {   
  223.    arcs[i][j].adj = INFINITY;   
  224.    arcs[i][j].info = NULL;   
  225.   }   
  226.  }   
  227.  for ( k = 0; k < arcnum; k++ )   
  228.  {   
  229.   cout<<"请输入第"<<k+1<<"边连接的两个顶点和权值。/n";   
  230.   cin>>v1>>v2>>w;   
  231.   arcs[v1-1][v2-1].adj = w;   
  232.   if ( incInfo != 0 )   
  233.   {   
  234.    cout<<"输入弧的信息,以字符串的形式存储。/n";   
  235.    cin>>arcs[v1-1][v2-1].info;   
  236.   }   
  237.   arcs[v2-1][v1-1].adj = arcs[v1-1][v2-1].adj;   
  238.  }   
  239. }   
  240. /*--------------------------------------------------------------------------*/  
  241. // 深度优先搜索遍历   
  242. template <typename CustomType>   
  243. void JMatrixGraph<CustomType>::DFSTraverse( bool (*Visit)(int v) )   
  244. {   
  245.  int v;   
  246.  for ( v = 0; v < vexnum; v++ ) visited[v] = false;   
  247.  for ( v = 0; v < vexnum; v++ )   
  248.   if ( !visited[v] ) DepthFirstSearch( v, Visit );   
  249. }   
  250. /*--------------------------------------------------------------------------*/  
  251. // 深度优先搜索   
  252. template <typename CustomType>   
  253. void JMatrixGraph<CustomType>::DepthFirstSearch( int v, bool (*Visit)(int v) )   
  254. {   
  255.  visited[v] = true; Visit( v );   
  256.  int w;   
  257.  for ( w = FirstAdjVex( v ); w >= 0; w = NextAdjVex( v, w ) )   
  258.   if ( !visited[w] ) DepthFirstSearch( w, Visit );   
  259. }   
  260. /*--------------------------------------------------------------------------*/  
  261. // 返回第v个顶点的第一个邻接点   
  262. template <typename CustomType>   
  263. int JMatrixGraph<CustomType>::FirstAdjVex( int v )   
  264. {   
  265.  int i;   
  266.  for ( i = 0; i < vexnum; i++ )   
  267.   if ( arcs[v][i].adj != 0 ) return i;// 这里只对无向图进行计算   
  268.  return -1;   
  269. }   
  270. /*--------------------------------------------------------------------------*/  
  271. // 返回第v个顶点的下一个邻接点   
  272. template <typename CustomType>   
  273. int JMatrixGraph<CustomType>::NextAdjVex( int v, int w )   
  274. {   
  275.  int i;   
  276.  for ( i = w + 1; i < vexnum; i++ )   
  277.   if ( arcs[v][i].adj != 0 ) return i;// 这里只对无向图进行计算   
  278.  return -1;   
  279. }   
  280. #endif  

 下面是我对《数据结构(严蔚敏版)》168页的G4图进行深度优先搜索。MainFrame.h文件如图所示。

Code:
  1. /*----------------------------------------------------------------------------  
  2. 蒋轶民制作:E-mail:jiangcaiyang123@163.com  
  3. ------------------------------------------------------------------------------  
  4. 文件名:MainFrame.h  
  5. ------------------------------------------------------------------------------  
  6. 作用:验证图结构是否创建成功。  
  7. /*--------------------------------------------------------------------------*/  
  8. // 头文件   
  9. #include <iostream>   
  10. #include "JGraph.h"   
  11.   
  12. using namespace std;   
  13.   
  14. bool VisitFunc( int v )   
  15. {   
  16.  cout<<"-----------深度优先搜索------------/n";   
  17.  cout<<"访问第"<<v+1<<"个顶点/n";   
  18.  return true;   
  19. }   
  20.   
  21. // 程序的入口   
  22. int main( int argc, char** argv )   
  23. {   
  24.  JMatrixGraph<char> jmg;   
  25.  jmg.CreateGraph( UDG );   
  26.  jmg.DFSTraverse( VisitFunc );   
  27.  return 0;   
  28. }  

 

 程序的截图如图所示:

 以后还会实现广度优先搜索和更多的功能的!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值