将邻接表转化为邻接矩阵

#include<iostream>
using namespace std;
//边表的结点
typedef struct Arcnode {
    //当前弧指向顶点的位置
    int adjvex;
    //指向下一条弧的指针
    struct Arcnode* nextarc;
}Arcnode;
//顶点表结点
typedef struct Vnode {
    //顶点信息
    char data;
    //指向第一条依附于该顶点的弧的指针
    Arcnode* firstarc;
}Vnode;
//组合的邻接表
struct AGraph {
    //邻接表
    Vnode adjlist[10];
    //顶点数和弧数
    int v;
    int e;
};
void insertedge(AGraph& g, int v1n, int v2n)//插入边
{
    Arcnode* p;//建立边结点的指针
    p = (Arcnode*)malloc(sizeof(Arcnode));//申请一个边结点空间
    //以下三步为头插法建立链表,将v2插入到v1后面
    p->adjvex = v2n;
    p->nextarc = g.adjlist[v1n].firstarc;
    g.adjlist[v1n].firstarc = p;
    //这个下面的三步是建立无向图的步骤,将v1同时插入到v2后面
    p = (Arcnode*)malloc(sizeof(Arcnode));
    //v2->v1
    p->adjvex = v1n;
    p->nextarc = g.adjlist[v2n].firstarc;
    g.adjlist[v2n].firstarc = p;
}
void CreatA(AGraph& g)//建立只有一个顶点没有边邻接表
{
    char v1, v2;//v1和v2代表两个顶点,而不能输入下标位置
    int v1n, v2n;//知道它的值还要知道他们在数组中的下标
    cout << "请输入顶点数量:";
    cin >> g.v;//存入顶点数
    for (int i=0; i < g.v; i++)//从数组下标中为0遍历到小于顶点数量
    {
        cout << "请输入顶点信息:";
        cin >> g.adjlist[i].data;//每次输入顶点数量保存在data域中
        g.adjlist[i].firstarc = NULL;//因为还没有设置边所以指向空
    }
    //插入边
    cout << "请输入边的数量:";
    cin >> g.e;
    for (int i = 0; i < g.e; i++)
    {
        cout << "v1->v2:";
        cin >> v1 >> v2;
        for (int i = 0; i < g.v; i++) {
            if (g.adjlist[i].data == v1)
                v1n = i;
            if (g.adjlist[i].data == v2)
                v2n = i;
        }
        insertedge(g, v1n, v2n);
    }
}
void displayA(AGraph g)
{
    Arcnode* p;
    for (int i = 0; i < g.v; i++)
    {
        cout << g.adjlist[i].data << "->";
        p = g.adjlist[i].firstarc;
        while (p)
        {
            cout << g.adjlist[p->adjvex].data << "->";
            p = p->nextarc;
        }
        if (p == NULL)
            cout << "NULL";
        cout << endl;
    }
}
struct MGraph {
    char vertex[10];
    int edges[10][10];
    int v, e;
};
void displayB(MGraph g)
{
    cout << "  ";
    for (int i = 0; i < g.v; i++)
    {
        cout << g.vertex[i] << " ";
    }
    cout << endl;
    for (int i = 0; i < g.v; i++)
    {
        cout << g.vertex[i] << " ";
        for (int j = 0; j < g.v; j++)
        {
            cout << g.edges[i][j]<<" ";
        }
        cout << endl;
    }
}
void AGtoMG(AGraph ga, MGraph& gm)
{
    Arcnode* p;
    for (int i = 0; i < ga.v; i++)
    {
        for (int j = 0; j < ga.v; j++)
            gm.edges[i][j] = 0;
    }
    for (int i = 0; i < ga.v; i++)
    {
        gm.vertex[i] = ga.adjlist[i].data;
    }
    for (int i = 0; i < ga.v; i++)
    {
        p = ga.adjlist[i].firstarc;
        while (p)
        {
            gm.edges[i][p->adjvex] = 1;
            p = p->nextarc;
        }
    }
    gm.e = ga.e;
    gm.v = ga.v;

}
int main(int argc, const char* argv[])
{
    AGraph ga;
    MGraph gm;
    CreatA(ga);
    displayA(ga);
    cout << endl;
    AGtoMG(ga, gm);
    displayB(gm);
    system("pause");
    return 0;
}


 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值