图的数组(邻接矩阵)存储实现

来源:互联网 发布:华为商务软件 编辑:程序博客网 时间:2024/04/30 09:05

图的结构体定义:

typedef ElemType AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];//顶点之间关系图typedef struct{    TElemType vexs[MAX_VERTEX_NUM];//顶点元素存储    AdjMatrix arcs;//顶点之间关系图    int vexnum, arcnum;//顶点个数和边或弧的数目    GraphKind kind;//图的种类}MGraph;

判断应该实现哪种图/网的邻接矩阵:

Status CreateGraph(MGraph &G){    cout << "please input the kind of graph" << endl;    cin >> (int&)G.kind;    switch (G.kind)    {        case DG:return CreateDG(G, PrintG);//构造有向图        case DN:return CreateDN(G, PrintN);//构造有向网        case UDG:return CreateUDG(G, PrintG);//构造无向图        case UDN:return CreateUDN(G,PrintN);//构造无向网        default:return ERROR;    }}

构造有向图并输出邻接矩阵:

Status CreateDG(MGraph &G, Status(*visit)(MGraph)){    TElemType v1, v2;    cout << "读入定点数和边数目:" << endl;    cin >> G.vexnum >> G.arcnum;//读入定点数和边数目    cout << "输入顶点元素:" << endl;    for (int i = 0; i < G.vexnum; i++)        cin >> G.vexs[i];//构造顶点向量    for (int i = 0; i < G.vexnum; i++)        for (int j = 0; j < G.vexnum; j++)            G.arcs[i][j] = 0;//邻接矩阵初始化    cout << "构造顶点之间关系:" << endl;    for (int k = 0; k < G.arcnum; k++)//构造邻接矩阵    {        cin >> v1 >> v2;//读入一条边依附的顶点和权值        int i = LocateVex(G, v1);        int j = LocateVex(G, v2);//确定v1,v2在图中的位置        G.arcs[i][j] = 1;//边 <v1,v2>的权值    }    visit(G);    return OK;}

构造无向图并输出邻接矩阵:

Status CreateUDG(MGraph &G,Status (*visit)(MGraph)){    TElemType v1, v2;    cout << "读入定点数和边数目:" << endl;    cin >> G.vexnum >> G.arcnum;//读入定点数和边数目    cout << "输入顶点元素:" << endl;    for (int i = 0; i < G.vexnum; i++)        cin >> G.vexs[i];//构造顶点向量    for (int i = 0; i < G.vexnum; i++)        for (int j = 0; j < G.vexnum; j++)            G.arcs[i][j] = 0;//邻接矩阵初始化    cout << "构造顶点之间关系:" << endl;    for (int k = 0; k < G.arcnum; k++)//构造邻接矩阵    {        cin >> v1 >> v2;//读入一条边依附的顶点和权值        int i = LocateVex(G, v1);        int j = LocateVex(G, v2);//确定v1,v2在图中的位置        G.arcs[i][j] = 1;//边 <v1,v2>的权值        G.arcs[j][i] = G.arcs[i][j];//置<v1,v2>的对称弧<v2,v1>    }    visit(G);    return OK;}

构造有向网并输出邻接矩阵:

Status CreateDN(MGraph &G,Status (* visit)(MGraph)){    TElemType v1, v2;    ElemType e;    cout << "读入定点数和边数目:" << endl;    cin >> G.vexnum >> G.arcnum;//读入定点数和边数目    cout << "输入顶点元素:" << endl;    for (int i = 0; i < G.vexnum; i++)        cin >> G.vexs[i];//构造顶点向量    for (int i = 0; i < G.vexnum; i++)        for (int j = 0; j < G.vexnum; j++)            G.arcs[i][j] = INFINITY;//邻接矩阵初始化    cout << "构造顶点之间关系:" << endl;    for (int k = 0; k < G.arcnum; k++)//构造邻接矩阵    {        cin >> v1 >> v2 >> e;//读入一条边依附的顶点和权值        int i = LocateVex(G, v1);        int j = LocateVex(G, v2);//确定v1,v2在图中的位置        G.arcs[i][j] = e;//边 <v1,v2>的权值    }    visit(G);    return OK;}

构造无向网并输出邻接矩阵:

Status CreateUDN(MGraph &G, Status(*visit)(MGraph)){    TElemType v1, v2;    ElemType e;    cout << "读入定点数和边数目:" << endl;    cin >> G.vexnum >> G.arcnum;//读入定点数和边数目    cout << "输入顶点元素:" << endl;    for (int i = 0; i < G.vexnum; i++)        cin >> G.vexs[i];//构造顶点向量    for (int i = 0; i < G.vexnum; i++)        for (int j = 0; j < G.vexnum; j++)            G.arcs[i][j] = INFINITY;//邻接矩阵初始化    cout << "构造顶点之间关系:" << endl;    for (int k = 0; k < G.arcnum; k++)//构造邻接矩阵    {        cin >> v1 >> v2 >>e;//读入一条边依附的顶点和权值        int i = LocateVex(G, v1);        int j = LocateVex(G, v2);//确定v1,v2在图中的位置        G.arcs[i][j] = e;//边 <v1,v2>的权值        G.arcs[j][i] = G.arcs[i][j];//置<v1,v2>的对称弧<v2,v1>    }    visit(G);    return OK;}

确定顶点关系输入元素时元素所对应的顶点序列号:

int LocateVex(MGraph G, TElemType e){    for (int i = 0; i < G.vexnum; i++)        if (G.vexs[i] == e)//如果元素为该顶点元素,输出该结点序列号            return i;}

调用输出邻接矩阵函数:

Status PrintVexs(TElemType t)//返回顶点元素{    cout << t << " ";    return OK;}Status PrintArcs(ElemType e)//返回邻接矩阵元素{    cout << e << " ";    return OK;}Status PrintMGraph(MGraph G)//打印网的邻接矩阵{    for (int i = 0; i <= G.vexnum; i++)    {        for (int j = 0; j <= G.vexnum; j++)        {            if (i == 0 && j == 0)//左上角输出为空                cout << "  ";            else if (i == 0)//第一行输出顶点元素                PrintVexs(G.vexs[j - 1]);            else if (j == 0)//第一列输出顶点元素                PrintVexs(G.vexs[i - 1]);            else                if (G.arcs[i - 1][j - 1] != (int)INFINITY)//如果不为INFINITY,输出邻接矩阵元素                    PrintArcs(G.arcs[i - 1][j - 1]);                else                    cout << INFINITY << " ";        }        cout << endl;    }    return OK;}Status PrintG(MGraph G)//打印图的邻接矩阵{    for (int i = 0; i <= G.vexnum; i++)    {        for (int j = 0; j <= G.vexnum; j++)        {            if (i == 0 && j == 0)                cout << "  ";            else if (i == 0)                PrintVexs(G.vexs[j - 1]);            else if (j == 0)                PrintVexs(G.vexs[i - 1]);            else                    PrintArcs(G.arcs[i - 1][j - 1]);        }        cout << endl;    }    return OK;}

main.cpp:

int main(){    MGraph G;    for (int i = 0; i < 4; i++)    {        menu();        CreateGraph(G);        char ch;        cout << "please enter a char to continue" << endl;        cin >> ch;        system("cls");    }    system("pause");    return 0;}

调试结果:
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述

原创粉丝点击