图的邻接表表示转换成邻接矩阵

本文介绍了如何从使用邻接表表示的无向图中,通过深度优先搜索(DFS)遍历,逐步转换为邻接矩阵表示。通过实例展示了创建邻接表、深度优先遍历和矩阵转换的过程,并提供了相应的C++代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

算法思想:
先初始化邻接矩阵。依次遍历各个顶点的边表,根据边表中记录的“改弧所指向的顶点的位置”修改邻接矩阵arc[i][j]的值。例如遍历第 i 行的时候(当前的顶点所在行数为 i ),依次遍历该顶点的边表结点,若当前顶点的弧顶点的位置为j,则arc[i][j] = 1

创建如下的图:
在这里插入图片描述

全部代码如下:

#include <iostream>

using namespace std;

#pragma region 创建邻接表存储的无向图

#define MaxVertexNum 100    //图中顶点数目最大值
#define VertexType char
#define _for(i,a,b) for(int i=(a);i<(b);i++)

typedef struct ArcNode {    //边表结点
    int adjvex;             //该弧所指向的顶点的位置
    ArcNode* next;          //指向下一条弧的指针
}ArcNode;

typedef struct VNode {      //顶点表结点
    VertexType data;        //顶点信息
    ArcNode* first;         //指向第一条依附该顶点的弧的指针
}VNode,AdjList[MaxVertexNum];

typedef struct {            
    AdjList vertices;       //领接表
    int vexnum, arcnum;     //图的顶点数和弧数
}ALGraph;                   //ALGraph是以邻接表存储的图类型


int LocateVex(ALGraph& G, VertexType x) {

    _for(i, 0, G.vexnum) {
        if (G.vertices[i].data == x)
            return i;
    }
    return -1;
}

void CreateALGraph(ALGraph& G) {

    cout << "输入顶点数和边数"<<endl;
    cin >> G.vexnum >> G.arcnum;
    _for(i, 0, G.vexnum) {
        cout << "输入第" << i + 1 << "个顶点的信息" << endl;
        cin >> G.vertices[i].data;
        G.vertices[i].first = NULL;
    }
    _for(k, 0, G.arcnum) {
        VertexType e1, e2;
        cout << "输入第" << k + 1 << "条边的顶点:" << endl;
        cin >> e1 >> e2;
        ArcNode* e = new ArcNode;
        if (!e) {
            cout << "内存申请失败!" << endl;
            exit(0);
        }

        int vi = LocateVex(G, e1);
        int vj = LocateVex(G, e2);

        e->adjvex = vj;									//这三步,类似于单链表的头插法
        e->next = G.vertices[vi].first;
        G.vertices[vi].first = e;

        e = new ArcNode;
        if (!e) {
            cout << "内存申请失败!" << endl;
            exit(0);
        }
        e->adjvex = vi;									
        e->next = G.vertices[vj].first;
        G.vertices[vj].first = e;
    }
}

bool visited[MaxVertexNum];

void DFS(ALGraph G, int i)          //邻接表的深度优先递归
{
    ArcNode* p;
    visited[i] = true;         		//访问过了该顶点,标记为TRUE 
    cout << G.vertices[i].data << " ";
    p = G.vertices[i].first;        //让p指向边表第一个结点 
    while (p) {                     //在边表内遍历 
        if (!visited[p->adjvex])    //对未访问的邻接顶点递归调用 
            DFS(G, p->adjvex);
        p = p->next;
    }
}

void DFSTraverse(ALGraph G) {        //邻接表的深度遍历操作
    _for(i, 0, G.vexnum)
        visited[i] = false;         //初始设置为未访问 
    _for(i, 0, G.vexnum)
        if (!visited[i])
            DFS(G, i);	            //对未访问的顶点调用DFS,若是连通图只会执行一次 			
}

#pragma endregion

//P223.4
//写出从图的邻接表表示转换成邻接矩阵表示的算法。

void Convert(ALGraph& G, int arcs[MaxVertexNum][MaxVertexNum]) {
    
    _for(i, 0, G.vexnum) {
        ArcNode *p = G.vertices[i].first;
        while (p) {
            arcs[i][p->adjvex] = 1;
            p = p->next;
        }
    }
}

int main()
{
    int arcs[MaxVertexNum][MaxVertexNum];
    memset(arcs, 0, sizeof(arcs));
    ALGraph G;
    CreateALGraph(G);
    cout << endl;
    cout << "DFS:" << endl;
    DFSTraverse(G);
    cout << endl;
    cout << endl;
    cout <<"转换后的邻接矩阵:"<< endl;
    Convert(G, arcs);
    _for(i, 0, G.vexnum) {
        _for(j, 0, G.vexnum)
            cout << arcs[i][j] << " ";
        cout << endl;
    }
   
    return 0;
}

输入:

5 7
a b c d e
a b
a e
b c
b d
b e
c d
d e

运行结果如下:
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Otto_1027

蟹蟹你,我会继续努力的~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值