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

图的结构体定义:

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;
}

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

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值