066.图的广度优先遍利

举报
C语言与CPP编程 发表于 2022/04/30 22:19:20 2022/04/30
【摘要】 /*//*//* 图形的广度优先搜寻法 *//* ///*/#include <stdlib.h>#include <stdio.h>#define MAXQUEUE 10 /* 队列的最大容量 */ struct node ...

  
  1. /*//*/
  2. /* 图形的广度优先搜寻法 */
  3. /* ///*/
  4. #include <stdlib.h>
  5. #include <stdio.h>
  6. #define MAXQUEUE 10 /* 队列的最大容量 */
  7. struct node /* 图的顶点结构定义 */
  8. {
  9. int vertex;
  10. struct node *nextnode;
  11. };
  12. typedef struct node *graph; /* 图的结构指针 */
  13. struct node head[9]; /* 图的顶点数组 */
  14. int visited[9]; /* 遍历标记数组 */
  15. int queue[MAXQUEUE]; /* 定义序列数组 */
  16. int front = -1; /* 序列前端 */
  17. int rear = -1; /* 序列后端 */
  18. /***********************二维数组向邻接表的转化****************************/
  19. void creategraph(int node[20][2],int num)
  20. {
  21. graph newnode; /* 顶点指针 */
  22. graph ptr;
  23. int from; /* 边起点 */
  24. int to; /* 边终点 */
  25. int i;
  26. for ( i = 0; i < num; i++ ) /* 第i条边的信息处理 */
  27. {
  28. from = node[i][0]; /* 边的起点 */
  29. to = node[i][1]; /* 边的终点 */
  30. /* 建立新顶点 */
  31. newnode = ( graph ) malloc(sizeof(struct node));
  32. newnode->vertex = to; /* 顶点内容 */
  33. newnode->nextnode = NULL; /* 设定指针初值 */
  34. ptr = &(head[from]); /* 顶点位置 */
  35. while ( ptr->nextnode != NULL ) /* 遍历至链表尾 */
  36. ptr = ptr->nextnode; /* 下一个顶点 */
  37. ptr->nextnode = newnode; /* 插入第i个节点的链表尾部 */
  38. }
  39. }
  40. /************************ 数值入队列************************************/
  41. int enqueue(int value)
  42. {
  43. if ( rear >= MAXQUEUE ) /* 检查伫列是否全满 */
  44. return -1; /* 无法存入 */
  45. rear++; /* 后端指标往前移 */
  46. queue[rear] = value; /* 存入伫列 */
  47. }
  48. /************************* 数值出队列*********************************/
  49. int dequeue()
  50. {
  51. if ( front == rear ) /* 队列是否为空 */
  52. return -1; /* 为空,无法取出 */
  53. front++; /* 前端指标往前移 */
  54. return queue[front]; /* 从队列中取出信息 */
  55. }
  56. /*********************** 图形的广度优先遍历************************/
  57. void bfs(int current)
  58. {
  59. graph ptr;
  60. /* 处理第一个顶点 */
  61. enqueue(current); /* 将顶点存入队列 */
  62. visited[current] = 1; /* 已遍历过记录标志置疑1*/
  63. printf(" Vertex[%d]\n",current); /* 打印输出遍历顶点值 */
  64. while ( front != rear ) /* 队列是否为空 */
  65. {
  66. current = dequeue(); /* 将顶点从队列列取出 */
  67. ptr = head[current].nextnode; /* 顶点位置 */
  68. while ( ptr != NULL ) /* 遍历至链表尾 */
  69. {
  70. if ( visited[ptr->vertex] == 0 ) /*顶点没有遍历过*/
  71. {
  72. enqueue(ptr->vertex); /* 奖定点放入队列 */
  73. visited[ptr->vertex] = 1; /* 置遍历标记为1 */
  74. printf(" Vertex[%d]\n",ptr->vertex);/* 印出遍历顶点值 */
  75. }
  76. ptr = ptr->nextnode; /* 下一个顶点 */
  77. }
  78. }
  79. }
  80. /*********************** 主程序 ************************************/
  81. /*********************************************************************/
  82. void main()
  83. {
  84. graph ptr;
  85. int node[20][2] = { {1, 2}, {2, 1}, /* 边信息数组 */
  86. {6, 3}, {3, 6},
  87. {2, 4}, {4, 2},
  88. {1, 5}, {5, 1},
  89. {3, 7}, {7, 3},
  90. {1, 7}, {7, 1},
  91. {4, 8}, {8, 4},
  92. {5, 8}, {8, 5},
  93. {2, 8}, {8, 2},
  94. {7, 8}, {8, 7} };
  95. int i;
  96. clrscr();
  97. puts("This is an example of Width Preferred Traverse of Gragh.\n");
  98. for ( i = 1; i <= 8; i++ ) /*顶点结构数组初始化*/
  99. {
  100. head[i].vertex = i;
  101. head[i].nextnode = NULL;
  102. visited[i] = 0;
  103. }
  104. creategraph(node,20); /* 图信息转换,邻接表的建立 */
  105. printf("The content of the graph's allist is:\n");
  106. for ( i = 1; i <= 8; i++ )
  107. {
  108. printf(" vertex%d =>",head[i].vertex); /* 顶点值 */
  109. ptr = head[i].nextnode; /* 顶点位置 */
  110. while ( ptr != NULL ) /* 遍历至链表尾 */
  111. {
  112. printf(" %d ",ptr->vertex); /* 打印输出顶点内容 */
  113. ptr = ptr->nextnode; /* 下一个顶点 */
  114. }
  115. printf("\n"); /* 换行 */
  116. }
  117. printf("The contents of BFS are:\n");
  118. bfs(1); /* 打印输出遍历过程 */
  119. printf("\n"); /* 换行 */
  120. puts(" Press any key to quit...");
  121. getch();
  122. }

文章来源: blog.csdn.net,作者:程序员编程指南,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/weixin_41055260/article/details/124495885

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。