编辑代码

#include <stdio.h>
#include <malloc.h>

#define MaxVertexNum 10

//定义一个指向图结点GNode的指针*PtrToGode
typedef struct GNode *PtrToGode;
//图结点
struct GNode{
    //顶点数
    int Nv;
    //边数
    int Ne;
    int G[MaxVertexNum][MaxVertexNum];
    //存顶点的数据
    //DataType Data[MaxVertexNum];
};
//以邻接矩阵存储的图类型
typedef PtrToGode MGraph;

//用顶点下标表示顶点,为整型
typedef int Vertex;

//定义一个指向图结点ENode的指针*PtrToEode
typedef struct ENode *PtrToENode;
//边结点
struct ENode{
    Vertex V1,V2;  //两个顶点
    int Weight; //权重
};
typedef PtrToENode Edge;

MGraph CreateGraph(int VertexNum);
void InsertEdge(MGraph Graph,Edge E);
MGraph BuildGraph();

//完整地建立一个图
MGraph BuildGraph(){
    MGraph Graph;
    Edge E;
    Vertex V;
    int Nv,i;
 
    printf("输入顶点数:\n");
    scanf("%d",&Nv);
    Graph = CreateGraph(Nv);
    printf("输入边数:\n");
    scanf("%d",&(Graph->Ne));
    if(Graph->Ne != 0){
        E = (Edge)malloc(sizeof(struct ENode));
        for(i = 0;i < Graph->Ne;i++){
            printf("输入要插入边的两个顶点以及权重\n");
            scanf("%d %d %d",&(E->V1),&(E->V2),(&E->Weight));
            InsertEdge(Graph,E);
        }
    }
    
    //如果顶点有数据的话,读入数据
    // for(V = 0;V < Graph->Nv;V++){
    //     scanf("%c",&(Graph->Data[V]));
    // }

    return Graph;
}

//简化版BuildGraph(考试)

// int Graph[MAXN[MAXN],Nv,Ne;

// void BuildGraph(){
//     int i,j,v1,v2,w;

//     //创建一个空图
//     scanf("%d",&Nv);
//     for(i = 0;i < Nv;i++){
//         for(j = 0;j < Nv;j++)
//         Graph[i][j] = 0;
//     }

//     //往图里插入边
//     scanf("%d",&Ne);
//     for(i = 0;i < Ne;i++){
//         scanf("%d %d %d",v1,v2,w);
//         Graph[v1][v2] = w;
//         Graph[v2][v1] = w;
//     }
// }

//向MGraph中插入边
void InsertEdge(MGraph Graph,Edge E){
    //插入边V1,V2
    Graph->G[E->V1][E->V2] = E->Weight;

    //若是无向图。还要插入边V2,V1
    Graph->G[E->V2][E->V1] = E->Weight;
}

//初始化一个有VertexNum个顶点,但没有边的图
MGraph CreateGraph(int VertexNum){
    int V,W;
    MGraph Graph;

    Graph = (MGraph)malloc(sizeof(struct GNode));
    Graph->Nv = VertexNum;
    Graph->Ne = 0;

    /*注意:
           这里默认顶点编号从0开始,到(Graph->Nv - 1)
    */
    for(V = 0;V < Graph->Nv;V++){
        for(W = 0;W < Graph->Nv;W++){
            //或者用无穷大赋值
            Graph->G[V][W] = 0;
        }
    }
    return Graph;
}

int main () {
  MGraph Graph = BuildGraph();
  int i,j;
  printf("创建的图的邻接矩阵为:\n");
  for(i = 0;i < Graph->Nv;i++){
      for(j = 0;j < Graph->Nv;j++){
          printf("%d ",Graph->G[i][j]);
      }
      printf("\n");
  }
}