当前位置:   article > 正文

数据结构基础6.1:图的表示方法_数据结构图的表示方法

数据结构图的表示方法

图的表示方法有多种:1. 邻接矩阵法 2. 邻接链表法 3. 十字链表法 4. 邻接多重表法

本文主要介绍邻接矩阵法和邻接链表法。

1.邻接矩阵法

好处:直观简单;方便检查任一对顶点间是否存在边;方便找任一顶点的所有邻接点;方便计算任一顶点的度。

坏处:浪费空间,对于稀疏图会有大量无效元素。

2.邻接矩阵法:

好处:方便找任一顶点的所有邻接点;节约稀疏图的空间

坏处:对于检查任意一对顶点间是否存在边并不方便。

两种表示方法具体代码如下:

1.邻接矩阵法

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <iostream>
  4. #include <malloc.h>
  5. using namespace std;
  6. /* 图的邻接矩阵表示法 */
  7. typedef int Vertex;
  8. typedef int Status;
  9. typedef int WeightType;
  10. #define MaxVertexSize 10
  11. #define ERROR 1
  12. #define OK 0
  13. /* 图结点的定义 */
  14. typedef struct GraphNode {
  15. int Nv;
  16. int Ne;
  17. WeightType matrix[MaxVertexSize][MaxVertexSize];
  18. } *MGraph;
  19. /* 边结点的定义 */
  20. typedef struct EdgeNode {
  21. Vertex head, rear;
  22. WeightType weight;
  23. } Edge;
  24. /* 初始化有NumV个顶点, 但是没有边的图 */
  25. MGraph CreateGraph(int NumV)
  26. {
  27. Vertex i, j;
  28. MGraph graph;
  29. if(!(graph = (MGraph)malloc(sizeof(struct GraphNode))))
  30. exit(1);
  31. graph->Nv = NumV;
  32. graph->Ne = 0;
  33. for(i = 0; i < NumV; i++)
  34. for(j = 0; j < NumV; j++)
  35. graph->matrix[i][j] = 0;
  36. return graph;
  37. }
  38. /* 向图中插入边 */
  39. Status InsertEdge(MGraph graph, Edge edge)
  40. {
  41. if(!graph)
  42. return ERROR;
  43. graph->matrix[edge.head][edge.rear] = edge.weight;
  44. /* 无向图还需添加下面一行代码 */
  45. graph->matrix[edge.rear][edge.head] = edge.weight;
  46. return OK;
  47. }
  48. /* 建立有Nv个顶点Ne条边的图 */
  49. MGraph BuildGraph()
  50. {
  51. int Nv;
  52. Vertex i;
  53. MGraph graph;
  54. Edge edge;
  55. scanf("%d", &Nv);
  56. graph = CreateGraph(Nv);
  57. scanf("%d", &graph->Ne);
  58. for(i = 0; i < graph->Ne; i++) {
  59. scanf("%d %d %d", &edge.head, &edge.rear, &edge.weight);
  60. InsertEdge(graph, edge);
  61. }
  62. return graph;
  63. }
  64. int main()
  65. {
  66. MGraph graph;
  67. graph = BuildGraph();
  68. system("pause");
  69. return 0;
  70. }

2.邻接链表法:

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <iostream>
  4. #include <malloc.h>
  5. using namespace std;
  6. /* 图的邻接链表表示法 */
  7. typedef int Vertex;
  8. typedef int Status;
  9. typedef int WeightType;
  10. #define MaxVertexSize 10
  11. #define ERROR 1
  12. #define OK 0
  13. /* 邻接点的定义 */
  14. typedef struct LinkNode {
  15. Vertex index;
  16. WeightType weight;
  17. struct LinkNode *next;
  18. } *pLink;
  19. /* 顶点表头结点的定义 */
  20. typedef struct LinkHead {
  21. pLink firstnode;
  22. } *pHead;
  23. /* 图结点的定义 */
  24. typedef struct GraphNode {
  25. int Nv; /* 顶点数 */
  26. int Ne; /* 边数 */
  27. pHead list; /* 邻接链表 */
  28. } *LGraph;
  29. /* 边结点的定义 */
  30. typedef struct EdgeNode {
  31. Vertex head, rear;
  32. WeightType weight;
  33. } Edge;
  34. /* 初始化有NumV个顶点, 但是没有边的图 */
  35. LGraph CreateGraph(int NumV)
  36. {
  37. Vertex i;
  38. LGraph graph;
  39. if(NumV < 0)
  40. return NULL;
  41. if(!(graph = (LGraph)malloc(sizeof(struct GraphNode))))
  42. exit(1);
  43. if(!(graph->list = (pHead)malloc(NumV * sizeof(struct LinkHead))))
  44. exit(1);
  45. graph->Nv = NumV;
  46. graph->Ne = 0;
  47. for(i = 0; i < NumV; i++) {
  48. graph->list[i].firstnode = NULL;
  49. }
  50. return graph;
  51. }
  52. /* 向图中插入边 */
  53. Status InsertEdge(LGraph graph, Edge edge)
  54. {
  55. pLink insert;
  56. if(!graph)
  57. return ERROR;
  58. if(!(insert = (pLink)malloc(sizeof(struct LinkNode))))
  59. exit(1);
  60. /* 插入边的初始化和 */
  61. insert->index = edge.rear;
  62. insert->weight = edge.weight;
  63. /* 将边插入到表头结点的下一个结点处 */
  64. insert->next = graph->list[edge.head].firstnode;
  65. graph->list[edge.head].firstnode = insert;
  66. /* 若是无向图还需添加以下代码 */
  67. if(!(insert = (pLink)malloc(sizeof(struct LinkNode))))
  68. exit(1);
  69. /* 插入边的初始化和 */
  70. insert->index = edge.head;
  71. insert->weight = edge.weight;
  72. /* 将边插入到表头结点的下一个结点处 */
  73. insert->next = graph->list[edge.rear].firstnode;
  74. graph->list[edge.rear].firstnode = insert;
  75. return OK;
  76. }
  77. /* 建立有Nv个顶点Ne条边的图 */
  78. LGraph BuildGraph()
  79. {
  80. int Nv;
  81. Vertex i;
  82. LGraph graph;
  83. Edge edge;
  84. scanf("%d", &Nv);
  85. graph = CreateGraph(Nv);
  86. scanf("%d", &graph->Ne);
  87. for(i = 0; i < graph->Ne; i++) {
  88. scanf("%d %d %d", &edge.head, &edge.rear, &edge.weight);
  89. InsertEdge(graph, edge);
  90. }
  91. return graph;
  92. }
  93. int main()
  94. {
  95. LGraph graph;
  96. graph = BuildGraph();
  97. system("pause");
  98. return 0;
  99. }



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

闽ICP备14008679号