四:图-邻接矩阵的初始化操作及应用

内容

    • 种类
    • 储存边
    • 存储图
    • 判断顶点在vexs中的下标位置
    • 创建图
    • 创建具体图或网
    • 创建有向图DG
    • 创建有向网DN
    • 创建无向图UDG
    • 创建无向网UDN

种类

//------枚举图的种类---
typedef enum {DG,DN,UDG,UDN} GraphKind;

储存边

typedef struct ArcCell{
    int adj;   //0-1或者权值;
  //  InfoType  *info;  //还不知道用来干啥??
}ArcCell,AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];

存储图

typedef struct {
    char  vexs[MAX_VERTEX_NUM];
    AdjMatrix arcs;

    int arcnum;
    int vexnum;

    GraphKind kind;
}MGraph;

判断顶点在vexs中的下标位置

int LocateVex(MGraph G, char v){
    for(int i=0;i<G.vexnum;i++){
        if(v==G.vexs[i]){
            return i;
        }else{
        return 0;
        }
    }
}

创建图

void CreatGraph(MGraph &G){
    cout<<"请输入想要创建的类型:"<<endl;
    cin>>G.kind;
    switch(G.kind){
    case DG : CreatDG(G);
    case DN:  CreatDN(G);
    case UDG: CreatUDG(G);
    case UDN:CreatUDN(G);
    }
}

创建具体图或网

创建有向图DG

void CreatUG(MGraph &G){
    cout<<"请输入顶点数目和边的数目:"<<endl;
    cin>>G.vexnum>>G.arcnum;
    for(int i=0;i<G.vexnum;i++){
        cout<<"请输入第"<<i+1<<"个顶点"<<endl;
        cin>>G.vexs[i];
    }
    for(int i=0;i<G.arcnum;i++){
        for(int j=0;j<G.arcnum;j++){
            //因为构建的是图,所以初始化为0
                G.arcs[i][j].adj=0;
            //G.arcs[i][j]={0,NULL};
        }
    }
    for(int i=0;i<G.arcnum;i++){
        char v1,v2;
        cout<<"请顺序输入第"<<i+1<<"条边的两个邻接点:"<<endl;
        cin>>v1>>v2;
        int i=LocateVex(G,v1);
        int j=LocateVex(G,v2);
        G.arcs[i][j].adj=1;
    }
}


创建有向网DN

void CreatUDN(MGraph &G){
    cout<<"请输入顶点数目和边的数目:"<<endl;
    cin>>G.vexnum>>G.arcnum;
    for(int i=0;i<G.vexnum;i++){
        cout<<"请输入第"<<i+1<<"个顶点"<<endl;
        cin>>G.vexs[i];
    }
    for(int i=0;i<G.arcnum;i++){
        for(int j=0;j<G.arcnum;j++){
            //因为构建的是网,所以初始化为无穷大
                G.arcs[i][j].adj=INFINITY;
            //G.arcs[i][j]={INFINITY,NULL};
        }
    }
    for(int i=0;i<G.arcnum;i++){
        char v1,v2;
        int w;
        cout<<"请顺序输入第"<<i+1<<"条边的两个邻接点和权值w:"<<endl;
        cin>>v1>>v2>>w;
        int i=LocateVex(G,v1);
        int j=LocateVex(G,v2);
        G.arcs[i][j].adj=w;
    }
}


创建无向图UDG

void CreatUG(MGraph &G){
    cout<<"请输入顶点数目和边的数目:"<<endl;
    cin>>G.vexnum>>G.arcnum;
    for(int i=0;i<G.vexnum;i++){
        cout<<"请输入第"<<i+1<<"个顶点"<<endl;
        cin>>G.vexs[i];
    }
    for(int i=0;i<G.arcnum;i++){
        for(int j=0;j<G.arcnum;j++){
            //因为构建的是图,所以初始化为0
                G.arcs[i][j].adj=0;
            //G.arcs[i][j]={0,NULL};
        }
    }
    for(int i=0;i<G.arcnum;i++){
        char v1,v2;
        cout<<"请输入第"<<i+1<<"条边的两个邻接点:"<<endl;
        cin>>v1>>v2;
        int i=LocateVex(G,v1);
        int j=LocateVex(G,v2);
        G.arcs[i][j].adj=1;
        G.arcs[j][i].adj=G.arcs[i][j].adj;
    }
}

创建无向网UDN

void CreatUDN(MGraph &G){
    cout<<"请输入顶点数目和边的数目:"<<endl;
    cin>>G.vexnum>>G.arcnum;
    for(int i=0;i<G.vexnum;i++){
        cout<<"请输入第"<<i+1<<"个顶点"<<endl;
        cin>>G.vexs[i];
    }
    for(int i=0;i<G.arcnum;i++){
        for(int j=0;j<G.arcnum;j++){
            //因为构建的是网,所以初始化为无穷大
                G.arcs[i][j].adj=INFINITY;
            //G.arcs[i][j]={INFINITY,NULL};
        }
    }
    for(int i=0;i<G.arcnum;i++){
        char v1,v2;
        int w;
        cout<<"请输入第"<<i+1<<"条边的两个邻接点和权值w:"<<endl;
        cin>>v1>>v2>>w;
        int i=LocateVex(G,v1);
        int j=LocateVex(G,v2);
        G.arcs[i][j].adj=w;
        G.arcs[j][i]=G.arcs[i][j]
    }
}

你可能感兴趣的:(#,大二上数据结构,数据结构,c++,c语言)