当前位置:   article > 正文

[数据结构]:22-图(邻接矩阵)(C语言实现)_补齐代码,新建一个图,完成以下功能: (1)判断两个结点之间是否有边存在; (2)输入任

补齐代码,新建一个图,完成以下功能: (1)判断两个结点之间是否有边存在; (2)输入任

目录

前言

已完成内容

图实现

01-开发环境

02-文件布局

03-代码

01-主函数

02-头文件

03-AdjMatrixCommon.cpp

04-AdjMatrixFunction.cpp

结语


前言

        此专栏包含408考研数据结构全部内容,除其中使用到C++引用外,全为C语言代码。使用C++引用主要是为了简化指针的使用,避免二重指针的出现。

已完成内容

[数据结构]:01-顺序表(C语言实现)_Chandni.的博客-CSDN博客

[数据结构]:02-单链表(C语言实现)_Chandni.的博客-CSDN博客

[数据结构]:03-栈(C语言实现)_Chandni.的博客-CSDN博客

[数据结构]:04-循环队列(数组)(C语言实现)_Chandni.的博客-CSDN博客

[数据结构]:05-循环队列(链表)(C语言实现)_Chandni.的博客-CSDN博客

[数据结构]:06-队列(链表带头结点)(C语言实现)_Chandni.的博客-CSDN博客

[数据结构]:07-二叉树(无头结点)(C语言实现)_Chandni.的博客-CSDN博客

[数据结构]:08-顺序查找(顺序表指针实现形式)(C语言实现)_Chandni.的博客-CSDN博客

[数据结构]:09-二分查找(顺序表指针实现形式)(C语言实现)_Chandni.的博客-CSDN博客

[数据结构]:10-二叉排序树(无头结点)(C语言实现)_Chandni.的博客-CSDN博客

[数据结构]:11-冒泡排序(顺序表指针实现形式)(C语言实现)_Chandni.的博客-CSDN博客

[数据结构]:12-快速排序(顺序表指针实现形式)(C语言实现)_Chandni.的博客-CSDN博客

[数据结构]:13-插入排序(顺序表指针实现形式)(C语言实现)_Chandni.的博客-CSDN博客

[数据结构]:14-选择排序(顺序表指针实现形式)(C语言实现)_Chandni.的博客-CSDN博客

[数据结构]:15-堆排序(顺序表指针实现形式)(C语言实现)_Chandni.的博客-CSDN博客

[数据结构]:16-归并排序(顺序表指针实现形式)(C语言实现)_Chandni.的博客-CSDN博客

[数据结构]:17-双链表(带头结点)(C语言实现)_Chandni.的博客-CSDN博客

[数据结构]:18-链栈(不带头结点)(C语言实现)_Chandni.的博客-CSDN博客

[数据结构]:19-串KMP模式匹配(数组)(C语言实现)_Chandni.的博客-CSDN博客

[数据结构]:20-线索二叉树(无头结点)(C语言实现)_Chandni.的博客-CSDN博客

[数据结构]:21-并查集(数组)(C语言实现)_Chandni.的博客-CSDN博客

图实现

01-开发环境

        语言:C/C++14

        编译器:MinGW64

        集成开发环境:CLion2022.1.3

02-文件布局

        请在CLion集成开发环境中创建C++可执行程序,否则无法运行,原因上面已解释。

                        ​​​​​             

03-代码

01-主函数

        用于测试。

  1. // 默认为无向图,若为有向图或网,请适当修改
  2. #include "./Head/AdjMatrix.h"
  3. #include "./Source/AdjMatrixCommon.cpp"
  4. #include "./Source/AdjMatrixFunction.cpp"
  5. int main() {
  6. AdjMGraph AdjMatrix;
  7. InitGraph(AdjMatrix);
  8. CreateGraph(AdjMatrix);
  9. PrintGraph(AdjMatrix);
  10. printf("VertexNum = %d,EdgeNum = %d\n", AdjMatrix.VexNum, AdjMatrix.EdgeNum);
  11. printf("-----------------------------------\n");
  12. // 判断两结点是否存在某边
  13. if (Adjacent(AdjMatrix, 0, 1)) {
  14. printf("true\n");
  15. } else {
  16. printf("false\n");
  17. }
  18. if (Adjacent(AdjMatrix, 2, 3)) {
  19. printf("true\n");
  20. } else {
  21. printf("false\n");
  22. }
  23. printf("VertexNum = %d,EdgeNum = %d\n", AdjMatrix.VexNum, AdjMatrix.EdgeNum);
  24. printf("-----------------------------------\n");
  25. // 列出与x邻接的边
  26. int Edge[MAXSIZE] = {-1, -1, -1, -1, -1};
  27. Neighbors(AdjMatrix, 0, Edge);
  28. for (int i = 0; Edge[i] != -1; i++) {
  29. printf("%3d", Edge[i]);
  30. }
  31. printf("\n");
  32. printf("VertexNum = %d,EdgeNum = %d\n", AdjMatrix.VexNum, AdjMatrix.EdgeNum);
  33. printf("-----------------------------------\n");
  34. // 删除顶点
  35. DeleteVertex(AdjMatrix, 0);
  36. PrintGraph(AdjMatrix);
  37. printf("VertexNum = %d,EdgeNum = %d\n", AdjMatrix.VexNum, AdjMatrix.EdgeNum);
  38. printf("-----------------------------------\n");
  39. // 添加顶点
  40. InsertVertex(AdjMatrix, 4);
  41. // 添加边
  42. AddEdge(AdjMatrix, 1, 4);
  43. PrintGraph(AdjMatrix);
  44. printf("VertexNum = %d,EdgeNum = %d\n", AdjMatrix.VexNum, AdjMatrix.EdgeNum);
  45. printf("-----------------------------------\n");
  46. // 删除边
  47. RemoveEdge(AdjMatrix, 0, 1);
  48. RemoveEdge(AdjMatrix, 1, 2);
  49. PrintGraph(AdjMatrix);
  50. printf("VertexNum = %d,EdgeNum = %d\n", AdjMatrix.VexNum, AdjMatrix.EdgeNum);
  51. printf("-----------------------------------\n");
  52. // 寻找第一个邻接点
  53. int Neighbor = FirstNeighbor(AdjMatrix, 1);
  54. printf("FirstNeighbor = %d\n", Neighbor);
  55. printf("VertexNum = %d,EdgeNum = %d\n", AdjMatrix.VexNum, AdjMatrix.EdgeNum);
  56. printf("-----------------------------------\n");
  57. // 寻找除4之外的下一个邻接点
  58. Neighbor = NextNeighbor(AdjMatrix, 1, 4);
  59. printf("FirstNeighbor = %d\n", Neighbor);
  60. printf("VertexNum = %d,EdgeNum = %d\n", AdjMatrix.VexNum, AdjMatrix.EdgeNum);
  61. printf("-----------------------------------\n");
  62. return 0;
  63. }

02-头文件

        用于存储结构体和常量等。

  1. //
  2. // Created by 24955 on 2023-04-02.
  3. // 默认为无向图,若为有向图或网,请适当修改
  4. //
  5. #ifndef INC_01_ADJACENTMATRIX_ADJMATRIX_H
  6. #define INC_01_ADJACENTMATRIX_ADJMATRIX_H
  7. // 头文件
  8. #include <stdio.h>
  9. // 常量
  10. #define MAXSIZE 5
  11. typedef int VertexType;
  12. typedef int EdgeType;
  13. // 结构体-邻接矩阵
  14. typedef struct {
  15. VertexType Vex[MAXSIZE];
  16. // 可采用压缩存储
  17. EdgeType Edge[MAXSIZE][MAXSIZE];
  18. int VexNum, EdgeNum;
  19. } AdjMGraph;
  20. #endif //INC_01_ADJACENTMATRIX_ADJMATRIX_H

03-AdjMatrixCommon.cpp

        用于存储初始化图、输出图等操作。

  1. //
  2. // Created by 24955 on 2023-04-02.
  3. // 默认为无向图,若为有向图或网,请适当修改
  4. //
  5. // 初始化图
  6. void InitGraph(AdjMGraph &AdjMatrix) {
  7. // 初始化顶点
  8. for (int i = 0; i < MAXSIZE; i++) {
  9. AdjMatrix.Vex[i] = -1;
  10. }
  11. // 初始化边
  12. for (int i = 0; i < MAXSIZE; i++) {
  13. for (int j = 0; j < MAXSIZE; j++) {
  14. AdjMatrix.Edge[i][j] = 0;
  15. }
  16. }
  17. AdjMatrix.VexNum = 0;
  18. AdjMatrix.EdgeNum = 0;
  19. }
  20. // 创建图 - 主要方便测试,并非图的正确创建方式,应根据具体情况具体分析
  21. void CreateGraph(AdjMGraph &AdjMatrix) {
  22. AdjMatrix.VexNum = 4;
  23. for (int i = 0; i < AdjMatrix.VexNum; i++) {
  24. AdjMatrix.Vex[i] = i;
  25. }
  26. // 无向图
  27. AdjMatrix.Edge[0][1] = 1;
  28. AdjMatrix.Edge[1][0] = 1;
  29. AdjMatrix.Edge[0][3] = 1;
  30. AdjMatrix.Edge[3][0] = 1;
  31. AdjMatrix.Edge[1][2] = 1;
  32. AdjMatrix.Edge[2][1] = 1;
  33. AdjMatrix.EdgeNum = 3;
  34. }
  35. // 输出邻接矩阵
  36. void PrintGraph(AdjMGraph AdjMatrix) {
  37. for (int i = 0; i < MAXSIZE; i++) {
  38. printf("%2d\t", AdjMatrix.Vex[i]);
  39. for (int j = 0; j < MAXSIZE; j++) {
  40. printf("%2d", AdjMatrix.Edge[i][j]);
  41. }
  42. printf("\n");
  43. }
  44. }

04-AdjMatrixFunction.cpp

        用于存储图的基本操作。

  1. //
  2. // Created by 24955 on 2023-04-02.
  3. // 默认为无向图,若为有向图或网,请适当修改
  4. //
  5. // 获取元素下标
  6. int GetIndex(AdjMGraph AdjMatrix, VertexType x) {
  7. /*
  8. * 1. 获取元素真实下标*/
  9. int xIndex = -1;
  10. for (int i = 0; i < MAXSIZE; i++) {
  11. if (AdjMatrix.Vex[i] == x) {
  12. xIndex = i;
  13. break;
  14. }
  15. }
  16. return xIndex;
  17. }
  18. // 判断图中是否存在边<x,y>
  19. bool Adjacent(AdjMGraph AdjMatrix, VertexType x, VertexType y) {
  20. /*
  21. * 1. 判断x->y是否存在边
  22. * 2. 存在返回true*/
  23. // 避免访问到不存在顶点
  24. if (x >= MAXSIZE || y >= MAXSIZE) {
  25. return false;
  26. }
  27. int xIndex = GetIndex(AdjMatrix, x);
  28. int yIndex = GetIndex(AdjMatrix, y);
  29. // 适用于无向图、有向图、网
  30. if (AdjMatrix.Edge[xIndex][yIndex] != 0) {
  31. return true;
  32. }
  33. return false;
  34. }
  35. // 列出图中与顶点x邻接的边
  36. void Neighbors(AdjMGraph AdjMatrix, VertexType x, int *Edge) {
  37. /*
  38. * 1. 遍历x所在行
  39. * 2. 用数组存储与之邻接的边另一个顶点*/
  40. int xIndex = GetIndex(AdjMatrix, x);
  41. // 未找到顶点x
  42. if (xIndex == -1) {
  43. return;
  44. }
  45. // 找到顶点x,统计x所在行
  46. for (int i = 0, j = 0; i < MAXSIZE; i++) {
  47. if (AdjMatrix.Edge[xIndex][i] != 0) {
  48. Edge[j++] = AdjMatrix.Vex[i];
  49. }
  50. }
  51. }
  52. // 插入顶点x
  53. void InsertVertex(AdjMGraph &AdjMatrix, VertexType x) {
  54. /*
  55. * 1. 插入,顶点个数+1*/
  56. if (AdjMatrix.VexNum == MAXSIZE) {
  57. return;
  58. }
  59. for (int i = 0; i < MAXSIZE; i++) {
  60. if (AdjMatrix.Vex[i] == -1) {
  61. AdjMatrix.Vex[i] = x;
  62. break;
  63. }
  64. }
  65. AdjMatrix.VexNum++;
  66. }
  67. // 删除顶点x
  68. void DeleteVertex(AdjMGraph &AdjMatrix, VertexType x) {
  69. /*
  70. * 1. 清除顶点,并修改顶点个数
  71. * 2. 清除边,并修改边个数*/
  72. // 清除顶点,将其值设为-1表示该顶点为空
  73. int xIndex = GetIndex(AdjMatrix, x);
  74. AdjMatrix.Vex[xIndex] = -1;
  75. AdjMatrix.VexNum--;
  76. // 清除边
  77. for (int i = 0; i < MAXSIZE; i++) {
  78. if (AdjMatrix.Edge[xIndex][i]) {
  79. AdjMatrix.EdgeNum--;
  80. AdjMatrix.Edge[xIndex][i] = 0;
  81. AdjMatrix.Edge[i][xIndex] = 0;
  82. }
  83. }
  84. }
  85. // 添加边
  86. void AddEdge(AdjMGraph &AdjMatrix, VertexType x, VertexType y) {
  87. /*
  88. * 1. 获取顶点值实际下标
  89. * 2. 插入边*/
  90. int xIndex = GetIndex(AdjMatrix, x);
  91. int yIndex = GetIndex(AdjMatrix, y);
  92. if (xIndex == -1 || yIndex == -1) {
  93. return;
  94. }
  95. // 添加边
  96. AdjMatrix.Edge[xIndex][yIndex] = 1;
  97. AdjMatrix.Edge[yIndex][xIndex] = 1;
  98. AdjMatrix.EdgeNum++;
  99. }
  100. // 删除边
  101. void RemoveEdge(AdjMGraph &AdjMatrix, VertexType x, VertexType y) {
  102. /*
  103. * 1. 获取顶点值实际下标
  104. * 2. 删除边*/
  105. int xIndex = GetIndex(AdjMatrix, x);
  106. int yIndex = GetIndex(AdjMatrix, y);
  107. if (xIndex == -1 || yIndex == -1) {
  108. return;
  109. }
  110. // 删除边
  111. AdjMatrix.Edge[xIndex][yIndex] = 0;
  112. AdjMatrix.Edge[yIndex][xIndex] = 0;
  113. AdjMatrix.EdgeNum--;
  114. }
  115. // 寻找图中顶点x的第一个邻接点
  116. int FirstNeighbor(AdjMGraph AdjMatrix, VertexType x) {
  117. /*
  118. * 1. 寻找第一个不为0的值,并返回顶点值*/
  119. int xIndex = GetIndex(AdjMatrix, x);
  120. if (xIndex == -1) {
  121. return -1;
  122. }
  123. for (int i = 0; i < MAXSIZE; i++) {
  124. if (AdjMatrix.Edge[xIndex][i]) {
  125. return AdjMatrix.Vex[i];
  126. }
  127. }
  128. return -1;
  129. }
  130. // 图的下一个邻接点-除y以外的下一个邻接点顶点号
  131. int NextNeighbor(AdjMGraph AdjMatrix, VertexType x, VertexType y) {
  132. /*
  133. * 1. 寻找y之后第一个不为0的值,并返回顶点值*/
  134. int xIndex = GetIndex(AdjMatrix, x);
  135. int yIndex = GetIndex(AdjMatrix, y);
  136. if (xIndex == -1 || yIndex == -1) {
  137. return -1;
  138. }
  139. // 寻找y之后的下一个邻接点
  140. for (int i = yIndex + 1; i < MAXSIZE; i++) {
  141. if (AdjMatrix.Edge[xIndex][i]) {
  142. return AdjMatrix.Vex[i];
  143. }
  144. }
  145. return -1;
  146. }

结语

        此博客主要用于408考研数据结构C语言实现记录,内有不足,可留言,可讨论。

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

闽ICP备14008679号