1. #define OK 1
    2. #define ERROR 0
    3. #define MAX_VERTEX 100
    4. #define VISIT 1
    5. #define UNVISITED 0
    6. //图的类型枚举
    7. typedef enum{
    8. DG,//有向图
    9. UDG,//无向图
    10. DN,//有向网
    11. UDN//无向网
    12. //网是带权的图
    13. }GraphKind;
    14. //设置顶点的数据类型为字符串型,使用时记得分配内存
    15. typedef char * VerTexType;
    16. //设置权值类型为整数类型
    17. typedef int ArcType;
    18. //返回的状态类型
    19. typedef int status;
    1. //数组(邻接矩阵)表示法
    2. #include <stdio.h>
    3. #include <stdlib.h>
    4. #include "GraphModel.h"
    5. #include <String.h>
    6. //图的邻接矩阵存储表示
    7. typedef struct{
    8. VerTexType verTexs[MAX_VERTEX];//顶点数组
    9. ArcType arcs[MAX_VERTEX][MAX_VERTEX]; //邻接矩阵
    10. int verTexCount;//图的顶点数
    11. int arcCount;//图的边/弧数
    12. GraphKind kind;//图的类型
    13. }MatrixGraph;
    14. //使用邻接矩阵表示法创建无向图
    15. status CreateUDG(MatrixGraph *G);
    16. //返回某个顶点在顶点集合中的下标(从0开始),不存在返回-1
    17. int LocateVex(MatrixGraph *G,VerTexType vex);
    18. //
    19. void TestMatrixGraph();
    20. //使用邻接矩阵表示法创建有向图
    21. status CreateDG(MatrixGraph *G);
    1. #include "MatrixGraph.h"
    2. /*
    3. 无向图的特点:
    4. 1.无向图的邻接矩阵是对称的
    5. 2.顶点i的度=第i行(列)中1的个数
    6. */
    7. //使用邻接矩阵表示法创建无向图
    8. status CreateUDG(MatrixGraph *G){
    9. G->kind=UDG;//设置当前创建图的类型为无向图
    10. printf("请输入无向图的顶点数:");
    11. scanf("%d",&G->verTexCount);
    12. printf("请输入边的数量:");
    13. scanf("%d",&G->arcCount);
    14. printf("依次输入顶点信息:\n");
    15. for(int i=0;i<G->verTexCount;i++){
    16. G->verTexs[i]=(VerTexType)malloc(sizeof(char)*10);
    17. printf("顶点%d:",i+1);
    18. scanf("%s",G->verTexs[i]);
    19. }
    20. //初始化邻接矩阵,所有边的权值设置为0
    21. for(int i=0;i<G->verTexCount;i++){
    22. for(int j=0;j<G->verTexCount;j++){
    23. G->arcs[i][j]=0;
    24. }
    25. }
    26. printf("请输入顶点和邻接顶点信息,构建邻接矩阵\n");
    27. for(int i=0;i<G->arcCount;i++){
    28. VerTexType vex1=(VerTexType)malloc(sizeof(char)*10);
    29. VerTexType vex2=(VerTexType)malloc(sizeof(char)*10);
    30. printf("顶点:");
    31. scanf("%s",vex1);
    32. printf("邻接点:");
    33. scanf("%s",vex2);
    34. //分别获得两个顶点在顶点数组中的坐标
    35. int x=LocateVex(G,vex1);
    36. int y=LocateVex(G,vex2);
    37. if(x==-1||y==-1){
    38. return ERROR;
    39. }
    40. G->arcs[x][y]=1;
    41. G->arcs[y][x]=G->arcs[x][y];//无向图的邻接矩阵是对称的
    42. free(vex1);
    43. free(vex2);
    44. }
    45. return OK;
    46. }
    47. //返回某个顶点在顶点集合中的下标(从0开始),不存在返回-1
    48. int LocateVex(MatrixGraph *G,VerTexType vex){
    49. int index=0;
    50. while(index<G->verTexCount){
    51. if(strcmp(G->verTexs[index],vex)==0){
    52. break;
    53. }
    54. index++;
    55. }
    56. return index==G->verTexCount ? -1:index;
    57. }
    58. void TestMatrixGraph(){
    59. MatrixGraph G;
    60. //创建无向图
    61. //status status=CreateUDG(&G);
    62. //创建有向图
    63. status status=CreateDG(&G);
    64. if(status ==ERROR){
    65. printf("创建图失败,请检查后重试");
    66. return;
    67. }
    68. printf("打印图的邻接矩阵:\n");
    69. printf("\t");
    70. for(int i=0;i<G.verTexCount;i++){
    71. printf("\t%s",G.verTexs[i]);
    72. }
    73. printf("\n");
    74. for(int i=0;i<G.verTexCount;i++){
    75. printf("\t%s",G.verTexs[i]);
    76. for(int j=0;j<G.verTexCount;j++){
    77. printf("\t%d",G.arcs[i][j]);
    78. }
    79. printf("\n");
    80. }
    81. }
    82. //使用邻接矩阵表示法创建有向图
    83. /*
    84. 有向图特点:
    85. 1. 有向图的邻接矩阵可能是不对称的
    86. 2. 顶点的出度=第i行元素之和
    87. 3. 顶点的入度=第i列元素之和
    88. 4. 顶点的度=第i行元素之和+第i列元素之和
    89. */
    90. status CreateDG(MatrixGraph *G){
    91. G->kind=DG;//设置当前创建图的类型为有向图
    92. printf("请输入有向图的顶点数:");
    93. scanf("%d",&G->verTexCount);
    94. printf("请输入边的数量:");
    95. scanf("%d",&G->arcCount);
    96. printf("依次输入顶点信息:\n");
    97. for(int i=0;i<G->verTexCount;i++){
    98. G->verTexs[i]=(VerTexType)malloc(sizeof(char)*10);
    99. printf("顶点%d:",i+1);
    100. scanf("%s",G->verTexs[i]);
    101. }
    102. //初始化邻接矩阵,所有边的权值设置为0
    103. for(int i=0;i<G->verTexCount;i++){
    104. for(int j=0;j<G->verTexCount;j++){
    105. G->arcs[i][j]=0;
    106. }
    107. }
    108. printf("请输入顶点和邻接顶点信息,构建邻接矩阵\n");
    109. for(int i=0;i<G->arcCount;i++){
    110. VerTexType vex1=(VerTexType)malloc(sizeof(char)*10);
    111. VerTexType vex2=(VerTexType)malloc(sizeof(char)*10);
    112. printf("顶点:");
    113. scanf("%s",vex1);
    114. printf("邻接点:");
    115. scanf("%s",vex2);
    116. //分别获得两个顶点在顶点数组中的坐标
    117. int x=LocateVex(G,vex1);
    118. int y=LocateVex(G,vex2);
    119. if(x==-1||y==-1){
    120. return ERROR;
    121. }
    122. G->arcs[x][y]=1;
    123. //G->arcs[y][x]=G->arcs[x][y];//有向图的邻接矩阵有可能不对称
    124. free(vex1);
    125. free(vex2);
    126. }
    127. return OK;
    128. }
    #include "MatrixGraph.h"
    
    int main(){
        TestMatrixGraph();
    
        return 0;
    }