当前位置:   article > 正文

邻接矩阵的深度优先遍历_深度优先遍历邻接矩阵

深度优先遍历邻接矩阵
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #define VertexMax 100 //最大顶点数为100
  4. typedef char VertexType; //每个顶点数据类型为字符型
  5. typedef struct
  6. {
  7. VertexType Vertex[VertexMax];//存放顶点元素的一维数组
  8. int AdjMatrix[VertexMax][VertexMax];//邻接矩阵二维数组
  9. int vexnum,arcnum;//图的顶点数和边数
  10. }MGraph;
  11. int LocateVex(MGraph *G,VertexType v)//查找元素v在一维数组 Vertex[] 中的下标,并返回下标
  12. {
  13. int i;
  14. for(i=0;i<G->vexnum;i++)
  15. {
  16. if(v==G->Vertex[i])
  17. {
  18. return i;
  19. }
  20. }
  21. printf("No Such Vertex!\n");
  22. return -1;
  23. }
  24. //无向图
  25. void CreateUDG(MGraph *G)
  26. {
  27. int i,j;
  28. printf("输入顶点个数和边数:\n");
  29. printf("顶点数 n=");
  30. scanf("%d",&G->vexnum);
  31. printf("边 数 e=");
  32. scanf("%d",&G->arcnum);
  33. printf("\n");
  34. printf("\n");
  35. printf("输入顶点元素(无需空格隔开):");
  36. scanf("%s",G->Vertex);
  37. printf("\n");
  38. for(i=0;i<G->vexnum;i++)
  39. for(j=0;j<G->vexnum;j++)
  40. {
  41. G->AdjMatrix[i][j]=0;
  42. }
  43. int n,m;
  44. VertexType v1,v2;
  45. printf("请输入边的信息:\n");
  46. for(i=0;i<G->arcnum;i++)
  47. {
  48. scanf(" %c%c",&v1,&v2);
  49. n=LocateVex(G,v1);
  50. m=LocateVex(G,v2);
  51. if(n==-1||m==-1)
  52. {
  53. printf("NO This Vertex!\n");
  54. return;
  55. }
  56. G->AdjMatrix[n][m]=1;
  57. G->AdjMatrix[m][n]=1;
  58. }
  59. }
  60. void print(MGraph G)
  61. {
  62. int i,j;
  63. printf("\n-------------------------------");
  64. printf("\n 邻接矩阵:\n\n");
  65. printf("\t ");
  66. for(i=0;i<G.vexnum;i++)
  67. printf(" %c",G.Vertex[i]);
  68. printf("\n");
  69. for(i=0;i<G.vexnum;i++)
  70. {
  71. printf("\t%c",G.Vertex[i]);
  72. for(j=0;j<G.vexnum;j++)
  73. {
  74. printf(" %d",G.AdjMatrix[i][j]);
  75. }
  76. printf("\n");
  77. }
  78. }
  79. /*深度优先遍历DFS*/
  80. int visited[VertexMax];//定义"标志"数组为全局变量
  81. void DFS(MGraph *G,int i)
  82. {
  83. int j;
  84. //1.处理起始点
  85. printf("%c",G->Vertex[i]);//1.输出起始结点
  86. visited[i]=1;//2.将已访问的结点标志成1
  87. //2.由起始点开始,对后续结点进行操作
  88. for(j=0;j<G->vexnum;j++)//依次搜索vi的邻接点
  89. {
  90. if(G->AdjMatrix[i][j]==1&&visited[j]==0)//当满足有边且未被访问过时,递归调用去查找该邻接点
  91. {
  92. DFS(G,j);//注意此处的G已经是指针类型,不需要再&G
  93. }
  94. }
  95. }
  96. void DFSTraverse(MGraph *G)
  97. {
  98. int i;
  99. //初始化"标志"数组为0,代表未访问
  100. for(i=0;i<G->vexnum;i++)
  101. {
  102. visited[i]=0;
  103. }
  104. for(i=0;i<G->vexnum;i++)
  105. {
  106. if(visited[i]==0)
  107. {
  108. DFS(G,i);//注意此处的G已经是指着类型,不需要再&G
  109. }
  110. }
  111. }
  112. int main()
  113. {
  114. MGraph G;
  115. CreateUDG(&G);
  116. print(G);
  117. printf("\n\n深度优先遍历:");
  118. DFSTraverse(&G);
  119. return 0;
  120. }

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

闽ICP备14008679号