当前位置:   article > 正文

数据结构严蔚敏版代码整理_数据结构严蔚敏全部源代码

数据结构严蔚敏全部源代码

第六章 图

由于图的结构比较复杂,任意两个节点之间都可能存在关系,所以不能依靠数据元素在存储区中的物理位置来表示元素之间的关系,即图没有顺序存储结构,但可以依靠邻接矩阵表示法,以及链式存储法,应对不同的需求选择不同的存储结构。

深度优先和广度优先遍历的C++实现如下:

  1. #include<iostream>
  2. #include<queue>
  3. using namespace std;
  4. typedef struct Point {
  5. int index;
  6. struct Point* next;
  7. }Point,*PT;
  8. typedef struct Graph {
  9. PT* nodes;
  10. int vn, en;
  11. bool* visit;
  12. }Graph,*G;
  13. void GraphInit(G& graph) {
  14. graph = new Graph;
  15. cout << "节点数量:";
  16. cin >> graph->vn;
  17. graph->nodes = new PT[graph->vn];
  18. graph->visit = new bool[graph->vn];
  19. int num;
  20. int node;
  21. for (int i = 0; i < graph->vn; i++) {
  22. graph->visit[i] = false;
  23. cout << "节点" << i + 1 << "邻居有几个?" << endl;
  24. cin >> num;
  25. graph->nodes[i] = new Point;
  26. graph->nodes[i]->index = i + 1;
  27. graph->nodes[i]->next = NULL;
  28. for (int j = 0; j < num; j++) {
  29. cout << "第" << j + 1 << "邻居为:";
  30. cin >> node;
  31. PT newNode = new Point;
  32. newNode->next = graph->nodes[i]->next;
  33. graph->nodes[i]->next = newNode;
  34. newNode->index = node;
  35. }
  36. }
  37. }
  38. void GraphShow(G graph) {
  39. for (int i = 0; i < graph->vn; i++) {
  40. PT p = graph->nodes[i];
  41. while (p) {
  42. cout << p->index << " ";
  43. p = p->next;
  44. }
  45. cout << endl;
  46. }
  47. }
  48. void DFS(G graph,int v=0) {
  49. cout << graph->nodes[v]->index<<" ";
  50. graph->visit[v] = true;
  51. PT p = graph->nodes[v];
  52. while (p->next) {
  53. if (!graph->visit[p->next->index-1])
  54. DFS(graph, p->next->index - 1);
  55. p = p->next;
  56. }
  57. }
  58. void BFS(G graph,int v=0) {
  59. for (int i = 0; i < graph->vn; i++)
  60. graph->visit[i] = false;
  61. queue<int>* qeu = new queue<int>;
  62. qeu->push(0);
  63. while (!qeu->empty()) {
  64. int pn = qeu->front();
  65. qeu->pop();
  66. cout << pn+1 << " ";
  67. graph->visit[pn] = true;
  68. PT p = graph->nodes[pn];
  69. while (p && p->next) {
  70. p = p->next;
  71. if (!graph->visit[p->index - 1]) {
  72. qeu->push(p->index - 1);
  73. graph->visit[p->index - 1] = true;
  74. }
  75. }
  76. }
  77. }
  78. int main(void) {
  79. //测试数据
  80. /*5
  81. 2
  82. 3
  83. 5
  84. 1
  85. 5
  86. 3
  87. 1
  88. 4
  89. 5
  90. 2
  91. 3
  92. 5
  93. 4
  94. 1
  95. 2
  96. 3
  97. 4*/
  98. //结果
  99. //1 5 3
  100. //2 5
  101. //3 5 4 1
  102. //4 5 3
  103. //5 4 3 2 1
  104. G g;
  105. GraphInit(g);
  106. GraphShow(g);
  107. cout << "深度优先遍历序列为:";
  108. DFS(g);
  109. cout << endl << "广度优先遍历序列为:";
  110. BFS(g);
  111. //1 5 4 3 2
  112. //1 5 3 4 2
  113. return 0;
  114. }

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

闽ICP备14008679号