AdjMGraph.h
上传用户:hbxtsdjs
上传日期:2022-04-11
资源大小:1594k
文件大小:3k
源码类别:

电子书籍

开发平台:

C/C++

  1. #include "SeqList.h" /*包含顺序表头文件*/
  2. typedef struct 
  3. {
  4. SeqList Vertices; /*存放顶点的顺序表*/
  5. int edge[MaxVertices][MaxVertices]; /*存放边的邻接矩阵*/
  6. int numOfEdges; /*边的条数*/
  7. }AdjMWGraph; /*图的结构体定义*/
  8. void Initiate(AdjMWGraph *G, int n) /*初始化*/
  9. {
  10. int i, j;
  11. for(i = 0; i < n; i++)
  12. for(j = 0; j < n; j++)
  13. {
  14. if(i == j) G->edge[i][j] = 0;
  15. else G->edge[i][j] = MaxWeight;
  16. }
  17. G->numOfEdges = 0; /*边的条数置为0*/
  18. ListInitiate(&G->Vertices); /*顺序表初始化*/
  19. }
  20. void InsertVertex(AdjMWGraph *G, DataType vertex)
  21. /*在图G中插入顶点vertex*/
  22. {
  23. ListInsert(&G->Vertices, G->Vertices.size, vertex); /*顺序表表尾插入*/
  24. }
  25. void InsertEdge(AdjMWGraph *G, int v1, int v2, int weight)
  26. /*在图G中插入边<v1, v2>,边<v1, v2>的权为weight*/
  27. {
  28. if(v1 < 0 || v1 > G->Vertices.size || v2 < 0 || v2 > G->Vertices.size)
  29. {
  30. printf("参数v1或v2越界出错!n");
  31. exit(1);
  32. }
  33. G->edge[v1][v2] = weight;
  34. G->numOfEdges++;
  35. }
  36. void DeleteEdge(AdjMWGraph *G, int v1, int v2)
  37. /*在图G中删除边<v1, v2>*/
  38. {
  39. if(v1 < 0 || v1 > G->Vertices.size || v2 < 0 || v2 > G->Vertices.size || v1 == v2)
  40. {
  41. printf("参数v1或v2越界出错!n");
  42. exit(1);
  43. }
  44. G->edge[v1][v2] = MaxWeight;
  45. G->numOfEdges--;
  46. }
  47. void DeleteVertex(AdjMWGraph *G, int v)
  48. //删除结点v
  49. {
  50. int n = ListLength(G->Vertices), i, j;
  51. DataType x;
  52. for(i = 0; i < n; i++)
  53. for(j = 0; j < n; j++)
  54. if((i == v || j == v) && G->edge[i][j] > 0 && G->edge[i][j] < MaxWeight)
  55. G->numOfEdges--; //被删除边计数
  56. for(i = v; i < n; i++)
  57. for(j = 0; j < n; j++)
  58. G->edge[i][j] = G->edge[i+1][j]; //删除第v行
  59. for(i = 0; i < n; i++)
  60. for(j = v; j < n; j++)
  61. G->edge[i][j] = G->edge[i][j+1]; //删除第v列
  62. ListDelete(&G->Vertices, v, &x); //删除结点v
  63. }
  64. int GetFirstVex(AdjMWGraph G, int v)
  65. /*在图G中寻找序号为v的顶点的第一个邻接顶点*/
  66. /*如果这样的邻接顶点存在则返回该邻接顶点的序号,否则返回-1*/
  67. {
  68. int col;
  69. if(v < 0 || v > G.Vertices.size)
  70. {
  71. printf("参数v1越界出错!n");
  72. exit(1);
  73. }
  74. for(col = 0; col <= G.Vertices.size; col++)
  75. if(G.edge[v][col] > 0 && G.edge[v][col] < MaxWeight) return col;
  76. return -1;
  77. }
  78. int GetNextVex(AdjMWGraph G, int v1, int v2)
  79. /*在图G中寻找v1顶点的邻接顶点v2的下一个邻接顶点*/
  80. /*如果这样的邻接顶点存在则返回该邻接顶点的序号,否则返回-1*/
  81. /*这里v1和v2都是相应顶点的序号*/
  82. {
  83. int col;
  84. if(v1 < 0 || v1 > G.Vertices.size || v2 < 0 || v2 > G.Vertices.size)
  85. {
  86. printf("参数v1或v2越界出错!n");
  87. exit(1);
  88. }
  89. for(col = v2+1; col <= G.Vertices.size; col++)
  90. if(G.edge[v1][col] > 0 && G.edge[v1][col] < MaxWeight) return col;
  91. return -1;
  92. }