当前位置:   article > 正文

数据结构 图邻接矩阵的深度优先遍历 C语言_给定如下图,用邻接矩阵实现该图的深度优先搜索遍历。 图片1.png

给定如下图,用邻接矩阵实现该图的深度优先搜索遍历。 图片1.png

 一、图的结构体定义

1、顶点数量

2、边的数量

3、邻接矩阵(数组表示)

4、顶点数组

5、图的类型(有向图或无向图)

  1. typedef struct GNode
  2. {
  3. int nv;
  4. int ne;
  5. char v[MAX_VNUM];
  6. int G[MAX_VNUM][MAX_VNUM];
  7. int GraphType;
  8. }

二、判断是无向图还是有向图

       输入0或者1,在主体函数判别即可。

三、图的创建

1、分别初始化顶点数量、边的数量-----输入

2、顶点集合,定义,输入每个顶点名称

3、邻接矩阵——先初始化为全为0,即没有边与任何顶点相连

4、输入邻接矩阵具体数据,有多少条边则输入几次:分别输入边的两个顶点和权重(这里不是带权邻接矩阵,输入边数,即1)

        无向图:对应G[v1][v2]=G[v2][v1]=1;

        有向图:对应G[V1][V2]=1;

  1. void GreatGraph(GNode *G)
  2. {
  3. printf("请输入顶点数和边数:");
  4. scanf("%d%d",&G->nv,&G->ne);//顶点数量、边的数量
  5. int i,j,w;
  6. for(i=0;i<G->nv;i++)//顶点集合
  7. {
  8. printf("第%d个顶点为:",i);
  9. scanf("%c",&G->v[i]);
  10. getchar();
  11. }
  12. for(i=0;i<G->nv;i++)
  13. for(j=0;j<G->nv;j++)
  14. G->G[i][j]==0;//初始化矩阵每一项为0
  15. int v1,v2,w1;
  16. for(w=0;w<G->ne;w++)//for循环,输入数据
  17. {
  18. printf("请输入两顶点及边数");
  19. scanf("%d%d%d",v1,v2,w1);
  20. if(G->GraphType==0)
  21. {
  22. G->G[v1][v2]=w1;
  23. G->G[v2][v1]=w1;
  24. }
  25. else
  26. {
  27. G->G[v1][v2]=w1;
  28. }
  29. }
  30. }

四、邻接矩阵的输出

  1. void out(GNode G)
  2. {
  3. int i,j;
  4. for(i=0;i<G.nv;i++)
  5. {
  6. for(j=0;j<G.nv;j++)
  7. {
  8. printf("%d ",G.G[i][j]);
  9. if((j+1)%(G.nv)==0)
  10. printf("\n");
  11. }
  12. }
  13. }

五、深度优先遍历

1、定义一个visit数组,没有遍历的为0,已经遍历的为1,以确保遍历不重复,定义在开头

int visit[MAX_VNUM];

2、设置所有顶点为0

3、从第0个开始,到第“边数最大数”,横向依次“遍历”邻接矩阵,如下:

              0:  ——————————————————————————>

              1:  ——————————————————————————>

              3:  ——————————————————————————>

              ......

如果矩阵数据为1,下一个输出的就是这个列数:1说明这两个顶点相连,这个顶点就是深度的下一个所指;

        此时,这个顶点所在的行,再次横向遍历,递归循环

此板块分成两个部分:

第一个部分为初始化为0,然后从第0个顶点开始看,如果为0则进行深度遍历,再第二个、第三个......

第二个部分就是深度遍历的主要板块:先把已经遍历了的改为1,输出这个顶点,再看这个顶点与哪一个顶点相连而且之前没有遍历过,递归循环。

  1. void DFS(GNode G,int v)
  2. {
  3. visit[v]=1;
  4. printf("%c->",G.v[v];
  5. for(int j=0;j<G.nv;j++)
  6. {
  7. if(!visit[j]&&G.G[v][j]==1)
  8. DFS(G,j);
  9. }
  10. }
  11. void TDFS(GNode G)
  12. {
  13. for(int i=0;i<G.nv;i++)
  14. {
  15. visit[i]=0;
  16. }
  17. for(int v=0;v<G.nv;v++)
  18. {
  19. if(visit[v]=0)
  20. GFS(G,v);
  21. }
  22. }

        

源代码完整版:

  1. #define MAX_VNUM 100
  2. #include<stdio.h>
  3. #include<stdlib.h>
  4. int visit[MAX_VNUM];
  5. typedef struct GNode
  6. {
  7. char v[MAX_VNUM];
  8. int nv;//顶点数
  9. int ne;//边数
  10. int G[MAX_VNUM][MAX_VNUM] ;
  11. int GraphType;
  12. }GNode;
  13. void GreatGraph(GNode *G)
  14. {
  15. printf("请输入顶点数和边数:");
  16. scanf("%d",&G->nv);
  17. scanf("%d",&G->ne);//注意%d后面不要加\n,会出bug(>^ < )
  18. fflush(stdin);
  19. for(int i=0;i<G->nv;i++)
  20. {
  21. printf("请输入第%d个顶点:",i);
  22. scanf("%c",&G->v[i]);
  23. getchar();
  24. }
  25. for(int v=0;v<G->nv;v++)
  26. for(int w=0;w<G->nv;w++)
  27. G->G[v][w]=0;
  28. int v1,v2,w1;
  29. for(int i=0;i<G->ne;i++)
  30. {
  31. if(G->GraphType==1)//有向图
  32. {
  33. printf("请输入V1和V2和边数:");
  34. scanf("%d%d%d",&v1,&v2,&w1);
  35. G->G[v1][v2]=w1;
  36. }
  37. else
  38. {
  39. printf("请输入V1和V2和边数:");
  40. scanf("%d%d%d",&v1,&v2,&w1);
  41. G->G[v1][v2]=w1;
  42. G->G[v2][v1]=w1;
  43. }
  44. }
  45. }
  46. //用邻接矩阵实现DFS
  47. void out(GNode G)
  48. {
  49. int i,j;
  50. for(i=0;i<G.nv;i++)
  51. {
  52. for(j=0;j<G.nv;j++)
  53. {
  54. printf("%d ",G.G[i][j]);
  55. if((j+1)%(G.nv)==0)
  56. printf("\n");
  57. }
  58. }
  59. }
  60. void DFS(GNode G,int i)//深度遍历
  61. {
  62. int j;
  63. visit[i]=1;//遍历了,变为1
  64. printf("%c-> ",G.v[i]);
  65. for(j=0;j<G.nv;j++)
  66. {
  67. if(!visit[i]&&G.G[i][i]==1)
  68. DFS(G,j);//递归调用
  69. }
  70. }
  71. void TraverseGraph(GNode G)
  72. {
  73. int v;
  74. for(v=0;v<G.nv;v++)
  75. {
  76. visit[v]=0;//设置初始值都为0
  77. }
  78. for(v=0;v<G.nv;v++)
  79. {
  80. if(!visit[v])
  81. DFS(G,v);
  82. }
  83. }
  84. int main()
  85. {
  86. GNode G;
  87. printf("请输入图的类型,有向为1,无向为0:");
  88. scanf("%d",&G.GraphType) ;
  89. GreatGraph(&G);
  90. printf("所以邻接矩阵为:\n");
  91. out(G);
  92. printf("深度遍历结果为:");
  93. TraverseGraph(G);
  94. return 0;
  95. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/596643
推荐阅读
相关标签
  

闽ICP备14008679号