邻接表

图论之邻接表 本文介绍了图的邻接表存储方法,使用邻接表存储图要稍微复杂一些,但能够提高空间利用率。本文给出了两种实现方法,一种是链式前向星,另一种是链表实现,链式前向星是利用数组来模拟链表,并且在最后给出了邻接表的一种打印方法。 阅读详情

邻接表

我们发现,当图中的边数相对于顶点较少时,邻接矩阵是对存储空间的极大浪费。我们可以考虑对边或弧使用链式存储的方式来避免空间浪费的问题。回忆树结构的孩子表示法,将结点存入数组,并对结点的孩子进行链式存储,不管有多少孩子,也不会存在空间浪费问题。

应用这种思路,我们把这种数组与链表相结合的存储方法称为邻接表(Adjacency List)。

邻接表的处理办法是这样。

1)  图中顶点用一个一维数组存储,当然也可以用单链表来存储,不过用数组可以较容易的读取顶点信息,更加方便。另外,对于顶点数组中,每个数据元素还需要存储指向第一个邻接点的指针,以便于查找该顶点的边信息。

2)  图中每个顶点vi的所有邻接点构成一个线性表,由于邻接点的个数不定,所以用单链表存储,无向图称为顶点vi的边表,有向图则称为以vi为弧尾的出边表。

下图是一个无向图的邻接表结构:

从图中我们知道,顶点表的各个结点由data和firstedge两个域表示,data是数据域,存储顶点的信息。

firstedge是指针域,指向边表的第一个结点,即此顶点的第一个邻接点。

边表结点由adjvex和next两个域组成。adjvex是邻接点域,存储某顶点的邻接点在顶点表中的下标,next则存储指

向边表中下一个结点的指针,比如v1顶点与v0、v2互为邻接点,则在v1的边表中,adjvex分别为v0的0和v2的2.

如果想知道某个顶点的度,就去查找这个顶点的边表中结点的个数。

若要判断顶点vi和vj是否存在边,只需要测试顶点vi的边表adjvex中是否存在结点vj的下标就行了。

若求顶点的所有邻接点,其实就是对此顶点的边表进行遍历,得到的adjvex域对应的顶点就是邻接点。

有向图的邻接表中顶点vi的边表是指以vi为弧尾的弧来存储的,这样很容易就可以得到每个顶点的出度。

有时为了便于确定顶点的入度或以顶点为弧头的弧,可以建立一个有向图的逆邻接表,即对每个顶点vi都建立

一个链接为vi为弧头的表。如下图所示:

此时我们很容易就可以算出某个顶点的入度或出度是多少,判断两顶点是否存在弧也很容易实现。

对于带权值的网图,可以在边表结点定义中再增加一个weight的数据域,存储权值信息即可,如下图所示:

//结点的定义
typedef char VertexType;
typedef int EdgeType;
#define MaxVex 100
typedef struct EdgeNode //边表结点
{
    int adjvex; //邻接点域,存储邻接顶点对应的下标
    EdgeType weight; //用于存储权值,对于非网图可以不需要
    struct EdgeNode *next; //链域,指向下一个邻接点
}EdgeNode;
typedef struct VertexNode  //顶点表结点
{
    VertexType data;  //顶点域,存储顶点信息
    EdgeNode *firstedge; //边表头指针
}VertexNode,AdjList[MaxVex];
 
typedef struct
{
    AdjList adjList;
    int numVertexes,numEdges; //图中当前顶点数和边数
}GraphAdjList;
//建立无向图的邻接表结构
void CreateALGraph(GraphAdjList *G)
{
    int i,j,k;
    EdgeNode *e;
    printf("输入顶点数和边数:\n");
    scanf("%d,%d",&G->numVertexes,&G->numEdges);
    for(i=0;i<G->numVertexes;i++)
    {
        scanf(&G->adjList[i].data); //输入顶点信息
        G->adjList[i].firstedge = NULL; //将边表置为空表
    }
    for(k=0;k<G->numEdges;k++)
    {
        printf("输入边(vi,vj)上的顶点序号:\n");
        scanf("%d,%d",&i,&j);
        e = (EdgeNode *)malloc(sizeof(EdgeNode)); //向内存申请空间,生成边表结点
        e->adjvex = j; //邻接序号为j
        e->next = G->adjList[i].firstedge;
        G->adjList[i].firstedge = e; //将当前顶点的指针指向e
 
        e = (EdgeNode *)malloc(sizeof(EdgeNode));
        e->adjvex = i; //邻接序号为i
        e->next = G->adjList[j].firstedge;
        G->adjList[j].firstedge = e; 
    }
}

 
 

【数据结构与算法】图——邻接表与邻接矩阵 邻接表与邻接矩阵 阅读详情

相关推荐

【邻接表存图模板】vector邻接表、数组邻接表、链式前向星

一、目录 一、目录 二、前言 三、邻接表“详解” (一)边的信息 (二)几种邻接表的实现方法“详解” 1.数组邻接表 代码 2.vector邻接表 代码 vector邻接表还有一种魔性写法: 3.链式前向星 代码 四、总结 二、前言 本来之前自己太弱了,一直只会用邻接矩阵,后来发现邻接表才是主流... 参考&特别鸣谢: https://www.cnblog...

十里寒塘路♣烟花一半醒 3113

邻接表详解(C/C++)

一、概念 二、分类 1)无向图的邻接表 2)有向图的邻接表(出弧) 3)有向图的逆邻接表(入弧) 三.步骤 四、代码

莫浅子的博客 4万+

邻接表(逆邻接表)创建

#include<cstdio> #include<iostream> #include<malloc.h> #define max_sum 30 using namespace std; typedef struct Arcnode{ int adjvex; struct Arcnode *nextarc; }Arcnode; typedef struct Vexnode{ char data; struct Arcnode *firstarc; }Vnod.

老6 2699

数据结构-C语言描述(邻接表)

邻接表是一种表示图的数据结构,事实上邻接表可以用于有向图、无向图、带权图、无权图。 邻接表表示法的优点主要有空间效率、遍历效率高。

小陈为梦想而生 1万+

邻接表创建

邻接表创建

q322359的博客 3207

【数据结构】图的存储结构—邻接表

在图论和计算机科学中,邻接表【Adjacency List】是用来表示有限图的无序表的集合。每个列表描述图中一个顶点的邻域集。今天来和叶子一起学习邻接表吧!

四季轮换叶,一路招摇胜 1万+

图的存储结构——邻接表

图的存储结构之邻接表一、邻接表表示法无向图的邻接表有向图的邻接表有向图的逆邻接表二、图的邻接表存储表示 一、邻接表表示法 回忆在线性表时,顺序存储结构就存在预先分配内存可能造成存储空间浪费的问题,于是引出了链式存储结构,同样的,我们可以考虑对边或弧使用链式存储方式来避免空间浪费问题 邻接表是图的一种链式存储结构。 由两部分组成:表头结点表和边表。 邻接表中每个单链表的第一个结点存放有关顶点的信...

ker的博客 5万+

在WPS/Office中免费使用AI,快速提升办公效率!​

《免费解锁WPS/Office AI办公神器教程》摘要: 本教程详解如何通过第三方插件OfficeAI免费实现WPS/Office智能办公,突破官方付费限制。从安全设置到安装配置,手把手教学,涵盖文档生成、PPT美化、Excel图表等核心功能。关键优势包括零成本、全场景支持及云端/本地双模式切换,并附常见问题解决方案。注意需使用WPS 2024+版本,安装时需临时关闭杀毒软件。教程强调工具来源合法性,建议商用购买正版授权。(149字)

杜哥无敌的博客 2303

邻接表和逆邻接表

邻接表作为图的一种存储方式,在存储稀疏图上相对于邻接矩阵有相当大的空间节省。如一个稀疏图的顶点个个数为n,边数为e。用邻接矩阵存储需要n^2空间,而真正进行存储的只有2e个空间, 剩下的n^2-2e都浪费了。但是对于邻接表来讲,存储空间只需要n+2e个,相对于邻接矩阵减少了很多。邻接表虽然在空间上有很大的优势,但是对于一个有向图,如果需要只要每个顶点的入度就需要遍历整个邻接表,在效率上很低下的。因...

乐行僧的博客 4万+

<Verilog实现除法器> Verilog实现牛顿-拉夫逊(Newton-Raphson)除法器

阿斯顿阿斯顿啊啊是打发士大夫

IC跳跳鱼的博客 3585

Windows Server下OnlyOffice Workspace社区版安装避坑指南(含局域网邮箱配置)

本文详细介绍了在Windows Server环境下部署OnlyOffice Workspace社区版的完整流程,特别针对企业内网环境中的邮箱配置和端口冲突等常见问题提供了实用解决方案。通过硬件资源配置建议、软件环境检查清单以及内网邮箱系统搭建方案对比,帮助用户高效搭建企业级协作平台,实现团队协作的无缝对接。

weixin_29231263的博客 449

有向图的邻接表转逆邻接表的算法

#include <iostream> using namespace std; typedef struct ArcNode{ int adjvex; int weight; ArcNode *next; }ArcNode; typedef struct VertexNode{ int vertex; ArcNode *firstarc; }VertexNode,Adj...

6855

树莓派4B保姆级教程:从零配置Python虚拟环境到PySide2开发全流程(含避坑指南)

本文提供树莓派4B上配置Python虚拟环境及PySide2 GUI开发的完整教程。针对armv7l架构的特殊性,详细讲解了从系统准备、虚拟环境创建到PySide2安装的避坑指南,并重点解决了跨平台UI文件处理等常见难题,帮助开发者构建稳定高效的开发环境。

9q8w7e6r5的博客 822

邻接表转化为逆邻接表

已知有n个顶点的有向图G的邻接表,设计算法求邻接表G的逆邻接表。

小L的博客 5623

运维颠覆!一文解锁AI赋能运维实战秘籍,效率飙升!

将AI应用于运维工作是一场极具价值的变革,从故障预测与诊断到自动化任务执行,再到资源管理优化,AI都展现出巨大潜力。尽管在实践过程中会面临数据质量、模型复杂性等挑战,但通过合理的技术选型和解决方案,我们能够充分挖掘AI的优势,实现运维工作的高效、智能转型。持续探索和创新AI在运维领域的应用,将为企业的数字化发展提供坚实保障。在科技飞速发展的当下,运维领域正经历着深刻变革,AI的融入成为提升运维效率与质量的关键。本文将深入实战,带你领略AI如何在运维各环节大显身手,让你的运维工作开启智能高效新模式。

探索云原生与智能化驱动下的安全运维新范式。关注DevSecOps、可观测性、AIOps等前沿领域,与您共赴技术前沿。 401

YOLO11涨点优化:注意力魔改 | 新颖的多尺度卷积注意力(MSCA),即插即用,助力小目标检测

多尺度卷积注意力(MSCA),有效地提取上下文信息,新颖度高,创新十足。

①答疑群聊服务;②YOLO大模型知识问答系统;③计算机视觉论文生成智能体; 6311

邻接表的创建

邻接表 特点:           1、想要知道某个顶点的度,就去查找这个顶点的边表中结点的个数                  2、若想判断顶点 Vi 到 Vj是否存在边,只需测试顶点 Vi 的边表中adjvex是否存在 Vj 的下标。           3、若求顶点的所有邻接点,其实就是对此顶点的边表进行遍历,得到adjvex域对应的顶点就是邻接点。 #inclu

怪咖小青年的博客 1万+

CesiumForUnreal实现地形等高线效果

CesiumForUnreal实现地形等高线效果

专注GIS开发 3437

邻接表的实现(有向邻接表)、(无向邻接表),基于C++

邻接表的介绍以及邻接表的代码实现

qq_40059236的博客 6006

YOLO11多类别数据集的类别平衡方法:讲解类别不平衡问题的识别方法,以及过采样、欠采样、类别权重调整等解决方案(一)

类别不平衡问题是机器学习和计算机视觉领域中一个常见但棘手的挑战。简单来说,当数据集中不同类别的样本数量存在显著差异时,我们就称这个数据集存在类别不平衡问题。在YOLO目标检测任务中,这意味着某些类别的目标对象在训练数据中出现得非常频繁,而其他类别的目标对象则很少出现。 想象一下,你正在训练一个交通监控系统,需要检测不同类型的车辆。在这个场景中,"汽车"这个类别可能有成千上万个实例,而"自行车"或"摩托车"可能只有几百个实例。这种数量上的巨大差异就是典型的类别不平衡问题。 从数学角度来看,假设我们有一个包

本博客聚焦 YOLOv11 全流程落地,涵盖架构优化、数据集处理、训练技巧与多场景部署,兼及国产数据库、Java 开发与 AI 模型应用,内容兼顾理论与工程实践,为开发者提供系统干货,助力高效提升技术能力。 939

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

数据结构:邻接表与逆邻接表

目前已知的信息: 邻接表是图的一种链式存储结构。在邻接表中,对图中每个顶点建立一个单链表。比如有v1,v2,v3,v4,v5节点,就有5个单链表。单链表存储什么呢?存储头结点和紧跟着头结点的多个普通表结点。 图例: 好了现在知道邻接表是如何存储数据了,关键是存储什么数据呢?下面一个例子可能会给读者启发。 有一无向图: 假若要你画出邻接表。 第一步:首先要画出头结点。还记得吗?前文提到一句话:“在邻接表中,对图中每个顶点建立一个单链表。” 所以照做: v3头结点后的v2,v4,v5是什么?可以发现,v2

qq_44131760的博客 8186

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

反向邻接表

以p和q作为工作指针,p负责遍历原始邻接表,q用于创建反向邻接表的边结点。在遍历原始邻接表的过程中,反向邻接表的边界点就是一个由顶点i指向顶点p->node的边。 #include <iostream> using namespace std; struct ArcNode //边表 { int node; //所指向的顶点的序号 ArcNode* next; }; struct Vertex //顶点表 { Ar..

amocken的博客 1037

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

图的逆邻接表及由邻接表导出逆邻接表代码

  1.图的邻接表与逆邻接表直接看下图理解: 2.由邻接表导出逆邻接表代码: void Reverse(ALGraph A,ALGraph &amp;B) { int i,k; ArcNode *p1,*p2; B.vn=A.vn; B.en=A.en; for(i=1; i&lt;=A.vn; i++) { scanf(...

我的笔记 6849
上一篇: 人间真实:程序员的 60 个崩溃瞬间!
下一篇: 头插法建立链表
黑色吊椅
博客等级 码龄9年 102粉丝 78原创
评论 10
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值