数据结构 图的邻接表

数据结构 图的邻接表呃,下面该写邻接表了…….邻接表的出现是因为图若是稀疏图,用邻接矩阵会造成空间的浪费,毕竟你要开辟一个一维数组和一个二维数组嘛,而且还是大开小用的那种。邻接表为了避免内存的浪费引入了链式存储,它的处理办法是:1.用一个一维数组存储顶点,当然你也可以用单链表存储,2.用单链表存储顶点的邻接点,可以将顶点改为结构体数组,结构体中存放邻接点的指针,邻接点也创建一个结构体,定义指针…

大家好,又见面了,我是你们的朋友全栈君。

呃,下面该写邻接表了…….

邻接表的出现是因为图若是稀疏图,用邻接矩阵会造成空间的浪费,毕竟你要开辟一个一维数组和一个二维数组嘛,而且还是大开小用的那种。

邻接表为了避免内存的浪费引入了链式存储,它的处理办法是:

1.用一个一维数组存储顶点,当然你也可以用单链表存储,

2.用单链表存储顶点的邻接点,可以将顶点改为结构体数组,结构体中存放邻接点的指针,邻接点也创建一个结构体,定义指针next存放该顶点的另一个邻接点,这样就可以把该顶点的所有邻接点串起来了。

下面是一个无向的网图:

数据结构 图的邻接表

邻接表中数据的存储图示如下(emmm,无向图果然没有有向图好画):

数据结构 图的邻接表

emmm,终于画完了,我来介绍下这个图

顶点表也就是个结构体数组,是存放顶点的结构,顶点表中有data元素,存放顶点信息  firstarc是一个边结构体表指针,存放邻接点的信息。

边表也是一个结构体,内有adivex元素,存放邻接点的下标,weight存放顶点与邻接点之间线的权重,next是边表结构体指针,存放该顶点的下一个邻接点,next就是负责将顶点的邻接点连起来。

看着上面的图慢慢理解吧!

下面则是代码部分:

#include <iostream>
using namespace std;

#define MAXVERTEX 100   //最大顶点数
typedef char vertextype;    //定义顶点的存储类型
typedef int arctype;    //定义边的权值类型

typedef struct ArcNode  //边表节点
{
    int adjvex; //邻接点域,存储该顶点对应的下标
    arctype wigth;  //用于存储权值
    struct ArcNode *next; //链域,指向下一个邻接点
}ArcNode;

typedef struct VertexNode   //顶点表节点
{
    vertextype data;    //存储顶点数据的信息
    ArcNode *firstarc;  //边表头指针
}VertexNode, AdjList[MAXVERTEX];

typedef struct
{
    AdjList adjlist;    //定义邻接表
    int numvertex;  //当前邻接表的顶点数
    int numarc; //当前邻接表的边数
}GraphAdjList;

//建立图的邻接表
void CreateAdjListGraph(GraphAdjList &G)
{
    ArcNode *e;
    cin >> G.numvertex; //输入当前图的顶点数
    cin >> G.numarc;    //输入当前图的边数
    for(int i = 0; i < G.numvertex; i++)    //建立顶点表
    {
        cin >> G.adjlist[i].data;   //输入顶点信息
        G.adjlist[i].firstarc = NULL;   //将表边指针置为空
    }
    for(int k = 0; k < G.numarc; k++)
    {
        int i, j, w;
        cin >> i >> j >> w; //输入边两边的顶点和边上的权重
        e = new ArcNode;   //创建一个表边节点指针
        e->adjvex = j;
        e->wigth = w;
        e->next = G.adjlist[i].firstarc;
        G.adjlist[i].firstarc = e;
        //因为是无向图,彼此相对称
        e = new ArcNode;   //创建一个表边节点指针
        e->adjvex = i;
        e->wigth = w;
        e->next = G.adjlist[j].firstarc;
        G.adjlist[j].firstarc = e;
    }
}

//打印邻接表
void PrintfGraphAdjList(GraphAdjList G)
{
    for(int i = 0; i < G.numvertex; i++)
    {
        ArcNode *p = G.adjlist[i].firstarc;
        cout << G.adjlist[i].data << '\t';
        while(p)
        {
            cout << p->adjvex << ' ' << p->wigth << '\t';
            p = p->next;
        }
        cout << endl;
    }
}
int main()
{
    GraphAdjList G;
    CreateAdjListGraph(G);
    PrintfGraphAdjList(G);
    return 0;
}

邻接表的时间复杂度:n为顶点数,e为边数 O(n + e)……

 

运行结果(根据上图的信息输入):

 

数据结构 图的邻接表

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/153945.html原文链接:https://javaforall.net

(0)
上一篇 2022年6月28日 下午4:00
下一篇 2022年6月28日 下午4:00


相关推荐

  • MFC使用TransparentBlt透明贴图

    MFC使用TransparentBlt透明贴图MFC 读取一张 Bmp 图时 图片不是透明背景时 使用 TransparentB 可对特定背景颜色进行过滤 函数原型 BOOLTranspar HDChdcDest intnXOriginD intnYOriginD intnWidthDes inthHeightDe HDChdcSrc intnXOriginS intnY

    2026年3月18日
    2
  • Java获取年月日

    Java获取年月日publicclassT publicstatic String args 1 普通的时间转换 Stringstring newSimpleDat yyyy MM dd format newDate toString System out println str

    2026年3月20日
    2
  • ContOS8 yum 安装rabbitMQ「建议收藏」

    ContOS8 yum 安装rabbitMQ「建议收藏」ContOS8 yum 安装rabbitMQ

    2022年4月23日
    39
  • volatile关键字作用

    volatile关键字作用一、作用简述内存可见性:保证变量的可见性:当一个被volatile关键字修饰的变量被一个线程修改的时候,其他线程可以立刻得到修改之后的结果。当一个线程向被volatile关键字修饰的变量写入数据的时候,虚拟机会强制它被值刷新到主内存中。当一个线程用到被volatile关键字修饰的值的时候,虚拟机会强制要求它从主内存中读取。 屏蔽JVM指令重排序(防止JVM编译源码生成class时使用重排序)…

    2022年6月1日
    41
  • cms漏洞扫描_大数据因果溯源分析

    cms漏洞扫描_大数据因果溯源分析CMS系统漏洞分析溯源(第5题)解题思路:登陆页面>>>扫描后台地址>>>登陆地址>>>查看是否可以绕过>>>不可以的话>>>百度管理系统源码>>>分析源码>>>查看登陆页面>>>找到相关php文件>>>admin_name>>>浏览器添加cookie>>>直接访问带有漏洞php文件的页面>>&

    2026年4月15日
    5
  • mysql索引b树b+树_用B

    mysql索引b树b+树_用B第一篇引用第二篇引用第三篇引用第四篇引用

    2022年8月9日
    7

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号