当前位置:   article > 正文

C语言实现图的广度优先搜索遍历和深度优先搜索遍历_图的广度优先搜索代码示例

图的广度优先搜索代码示例

1.实现存储结构为邻接矩阵的广度优先搜索遍历和深度优先搜索遍历

代码实现

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <stdbool.h>
  4. #define MaxVertexNum 100//顶点数目的最大值
  5. //邻接矩阵法
  6. typedef int Type;
  7. typedef char VexType;
  8. //无权图用1或0表示是否相邻,带权图则为权值类型
  9. typedef struct ArcNode{
  10. Type adj;
  11. }ArcNode;
  12. typedef struct{
  13. VexType Vex[MaxVertexNum];//顶点表
  14. ArcNode Edge[MaxVertexNum][MaxVertexNum];//边表
  15. int vexnum,arcnum;//图的当前顶点数和边数/弧数
  16. }MGraph;
  17. //获取顶点位置
  18. int LocateVex(MGraph* G,VexType v){//v是查找的顶点的数据
  19. int k ;
  20. for(k = 0;k < G->vexnum;k++){
  21. if(G->Vex[k] == v){
  22. break;
  23. }
  24. //如果没有找到匹配的顶点,k的值将等于邻接矩阵的顶点数G->vexnum
  25. }
  26. return k;
  27. }
  28. //创建无向图的邻接矩阵
  29. void CreateAdjMatrix(MGraph* G){
  30. int i,j,k;
  31. VexType v1,v2;
  32. printf("请输入图的顶点和弧数:");
  33. scanf("%d%d",&G->vexnum,&G->arcnum);
  34. for(i = 0;i < G->vexnum;i++){
  35. //初始化邻接矩阵
  36. for(j = 0;j < G->vexnum;j++){
  37. G->Edge[i][j].adj = 0;
  38. }
  39. }
  40. printf("输入图的顶点:");
  41. for(i = 0;i < G->vexnum;i++){
  42. scanf(" %c",&G->Vex[i]);
  43. }
  44. for(k = 0;k < G->arcnum;k++){
  45. printf("输入第%d条弧的两个顶点:",k + 1);
  46. scanf(" %c %c",&v1,&v2);//输入一个弧的两个顶点
  47. i = LocateVex(G,v1);
  48. j = LocateVex(G,v2);
  49. G->Edge[i][j].adj = 1;//建立对称弧
  50. G->Edge[j][i].adj = 1;
  51. }
  52. }
  53. //邻接矩阵实现广度优先搜索
  54. int Bvisited[MaxVertexNum] = {0};//访问标志数组
  55. void BFS(MGraph G,int v0){
  56. int queue[MaxVertexNum]; //一维数组模拟队列操作
  57. int rear = 0;
  58. int front = 0;
  59. int v;//模拟队尾指针和队头指针
  60. printf("%c ",G.Vex[v0]);
  61. Bvisited[v0] = 1;
  62. queue[rear] = v0; //模拟入队
  63. while(rear >= front){
  64. v = queue[front];
  65. front++; //模拟出队
  66. for(int i = 0;i < G.vexnum; i++){
  67. if(G.Edge[v][i].adj == 1 && !Bvisited[i]){
  68. printf("%c ",G.Vex[i]);
  69. Bvisited[i] = 1;
  70. rear++;
  71. queue[rear] = i; //模拟入队
  72. }
  73. }
  74. }
  75. }
  76. //深度优先搜索
  77. int Dvisited[MaxVertexNum] = {0}; //访问标志数组
  78. void DFS(MGraph G ,int v0){
  79. printf("%c ",G.Vex[v0]);
  80. Dvisited[v0] = 1;
  81. for(int i = 0; i < G.vexnum;i++){
  82. if(!Dvisited[i] && G.Edge[v0][i].adj == 1){
  83. DFS(G,i);
  84. }
  85. }
  86. }
  87. int main(){
  88. MGraph G;
  89. CreateAdjMatrix(&G);
  90. printf("广度优先搜索:");
  91. BFS(G,0);
  92. printf("\n深度优先搜索:");
  93. DFS(G, 0);
  94. return 0;
  95. }

运行截图

 注意:

        在这里广度优先遍历没有使用队列而是使用了数组代替了队列,如果使用队列可以使用顺序队列,然后使用入队和出队的代码,在这里数组其实作用差不太多

2.1.实现存储结构为邻接表的广度优先搜索遍历和深度优先搜索遍历

代码实现

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <stdbool.h>
  4. #define MaxVertexNum 100//顶点数目的最大值
  5. #define MaxSize 100
  6. typedef char VertexData;
  7. //邻接表法
  8. typedef struct ArcNode{//边表结点
  9. int adjvex;//该弧所指向的顶点的位置
  10. struct ArcNode* next;//指向下一条弧的指针
  11. int info;//网的边权值
  12. }ArcNode;
  13. typedef struct VNode{//顶点表结点
  14. VertexData data;//顶点信息
  15. ArcNode* first;//指向第一条依附该顶点的弧的指针
  16. }VNode,AdjList[MaxVertexNum];
  17. typedef struct{
  18. AdjList vertices;//邻接表
  19. int vexnum,arcnum;//图的顶点数和弧数
  20. }ALGraph;//以邻接表存储的图类型
  21. //求顶点位置
  22. int LocateVertex(ALGraph* G,VertexData v){
  23. int k;
  24. for(k = 0;k < G->vexnum;k++){
  25. if(G->vertices[k].data == v){
  26. break;
  27. }
  28. }
  29. return k;
  30. }
  31. //创建图的邻接表
  32. void CreateALGraph(ALGraph* G){
  33. int i,j,k;
  34. VertexData v1,v2;
  35. ArcNode* p;
  36. printf("请输入图的顶点和弧数:");
  37. scanf("%d %d",&G->vexnum,&G->arcnum);
  38. printf("请输入图的顶点:");
  39. for(i = 0;i < G->vexnum;i++){//输入图的顶点,初始化顶点结点
  40. scanf(" %c",&(G->vertices[i].data));
  41. G->vertices[i].first = NULL;
  42. }
  43. for(k = 0;k < G->arcnum;k++){
  44. printf("输入第%d条弧的两个顶点:",k + 1);
  45. scanf(" %c %c",&v1,&v2);//输入一条弧的两个结点数
  46. i = LocateVertex(G,v1);
  47. j = LocateVertex(G,v2);
  48. p = (ArcNode*)malloc(sizeof(ArcNode));//申请新弧结点
  49. p->adjvex = j;
  50. p->next = G->vertices[i].first;
  51. G->vertices[i].first = p;//头插法建立链表
  52. }
  53. }
  54. //广度优先
  55. int Bvisited[MaxVertexNum] = {0};
  56. void BFS(ALGraph G,int v0){
  57. int queue[MaxVertexNum];
  58. int rear = 0,front = 0,v;
  59. ArcNode* p;
  60. printf("%c ",G.vertices[v0].data);
  61. Bvisited[v0] = 1;
  62. queue[rear] = v0;
  63. while(rear >= front){
  64. v = queue[front];
  65. front++;
  66. p = G.vertices[v].first;
  67. while(p != NULL){
  68. if(!Bvisited[p->adjvex]){
  69. printf("%c ",G.vertices[p->adjvex].data);
  70. Bvisited[p->adjvex] = 1;
  71. rear++;
  72. queue[rear] = p->adjvex;
  73. }
  74. p = p->next;
  75. }
  76. }
  77. }
  78. //深度优先
  79. int Dvisited[MaxVertexNum] = {0};
  80. void DFS(ALGraph G,int v0){
  81. printf("%c ",G.vertices[v0].data);
  82. Dvisited[v0] = 1;
  83. ArcNode* p;
  84. p = G.vertices[v0].first;
  85. while(p != NULL){
  86. if(!Dvisited[p->adjvex]){
  87. DFS(G,p->adjvex);
  88. }
  89. p = p->next;
  90. }
  91. }
  92. int main(){
  93. ALGraph G;
  94. CreateALGraph(&G);
  95. printf("\n广度优先搜索:");
  96. BFS(G,0);
  97. printf("\n深度优先搜索:");
  98. DFS(G,0);
  99. return 0;
  100. }

测试可以按照上一个运行的测试样例对照

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

闽ICP备14008679号