邻接表(链式存储)实现图的存储

目录

一. 前言

二. 用邻接表创建无向网的完整源代码


一. 前言

        无向图邻接表的形式如下所示:

    

 其中类如v1的结点为头结点,头结点后面的结点为边结点,表示与头结点中顶点相连的边的信息。

采用邻接表创建无向网的算法思路:

1)首先输入总的顶点数和总边数

2)接着建立顶点表:依次输入顶点的信息存入到顶点表当中,并使每个表头结点的指针域初始化为NULL。

3)创建邻接表:依次输入每条边两边的顶点,然后确定两个顶点的序号n和m,建立边结点,将这个边结点分别插入到V(n)和V(m)对应的两个边链表的头部。

二. 用邻接表创建无向网的完整源代码

#include<stdio.h>
#include<iostream>
using namespace std;

//首先定义好边结点,因为会在头结点中使用到
typedef struct arcnode{    
    int adjvex;    //用来存放与头结点相连顶点的序号
    struct arcnode* nextvex;    //用来指向下一个与头结点相连边结点的指针
    int info;    //如果有权值,就设置这一项,这就是无向网和无向图的区别
}arcnode;

//定义头结点
typedef struct{
    char data;    //存放顶点
    arcnode* firstarc;    //指针指向第一个边结点
}vexnode,VL[100];    //用VL这个数组来存放所有的头结点

//定义一个邻接表
typedef struct ALGraph{
    VL vexs;    //存放所有顶点信息的VL类型数组
    int vexnum,arcnum;    //总的顶点数和边数
}

//函数声明,后面会用到
int LocateALGraph(ALGraph G,char c);

void CreateALGraph(ALGraph &G){
    //首先输入总的顶点数和边数
    cin>>G.vexnum>>G.arcnum;
    
    //接着继续输入顶点信息
    for(int i=0;i<G.vexnum;i++){
        cin>>G.vexs[i].data;
        G.vexs[i].firstarc=NULL;
    }

    //开始输入边信息
    for(int j=0;j<G.arcnum;j++){
        char v1,v2;
        cin>>v1>>v2;
        int n=LocateALGraph(G,v1);    //用两个变量来接收这两个顶点所在的序号位置
        int m=LocateALGraph(G,v2);
        arcnode* p1=new arcnode;    //创建边结点
        p1->adjvex=m;    //使用头插法将边结点放到头结点的后面
        p1->nextvex=G.vexs[n].firstarc;
        G.vexs[n].firstarc=p1;
        //因为是无向网,则需要对称存放,若是有向图或者有向网则不需要
        arcnode* p2=new arcnode;
        p2->adjvex=n;
        p2->nextvex=G.vexs[m].firstarc;
        G.vexs[m].firstarc=p2;
    }


//求G顶点表中顶点为c的顶点序号
int LocateALGraph(ALGraph G,char c){
    for(int i=0;i<G.vexnum;i++){
        if(G.vexs[i].data==c)
            return i;
        }
    return -1;
}

//可调用上面函数创建无向网的邻接表,对它进行相关操作
int main(){
    
}


        

  • 6
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以帮你解答这个问题。邻接表和逆邻接表是一种常用的存储结构,它们可以方便地表示中节点之间的关系。 邻接表是一种链式存储结构,将每个节点的邻居节点存储在一个链表中。具体地说,对于每个节点,我们可以使用一个链表来存储与该节点相邻的节点。因此,邻接表由一个节点数组和一个链表数组组成。 逆邻接表邻接表的反向表示,它存储了每个节点的入边信息。对于每个节点,我们可以使用一个链表来存储指向该节点的边。因此,逆邻接表也由一个节点数组和一个链表数组组成,但是链表中存储的是指向该节点的边。 下面是一个使用邻接表和逆邻接表存储的有向的例子: ``` // 邻接表 int adjList[5][3] = {{1, 3, -1}, {2, -1, -1}, {4, -1, -1}, {1, 2, 4}, {0, 3, -1}}; // 逆邻接表 int reverseAdjList[5][3] = {{4, -1, -1}, {0, 3, -1}, {1, -1, -1}, {3, -1, -1}, {0, -1, -1}}; ``` 在这个例子中,有向包含 5 个节点,编号分别为 0 到 4。邻接表中,第 i 个节点的邻居节点存储在 adjList[i] 这个链表中,链表中的每个元素表示一条从 i 到该元素所表示的节点的有向边。例如,adjList[0] = {1, 3, -1} 表示节点 0 有两条出边,一条指向节点 1,一条指向节点 3。 逆邻接表中,第 i 个节点的入边信息存储在 reverseAdjList[i] 这个链表中,链表中的每个元素表示一条从该元素所表示的节点到 i 的有向边。例如,reverseAdjList[0] = {4, -1, -1} 表示节点 0 有一条入边,来自节点 4。 希望这个例子能够帮助你理解邻接表和逆邻接表的概念。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值