0x13 链表与邻接表

0x13 链表与邻接表

数组是一种支持随机访问,但不支持在任意位置插入和删除元素的数据结构。与之相对应,链表支持在任意位置插入或删除元素,但只能按顺序依次访问其中元素。我们可以使用一个struct来表示链表的节点,其中可以存储任意数据。另外用prevnext两个指针指向前后两个相邻的节点,构成一个常见的双向链表。为了避免在左右两端或者空链表中访问越界,我们通常建立额外的两个节点headtail代表链表头尾 ,把实际数据节点存储在headtail之间,来减少链表边界处的判断,减低编程复杂度。

c++ 复制代码
struct node{
    int value;
    node *prev,*next;
};
node *head,*tail;

void initialize()
{
    head=new node();
    tail=new node();
    head->next=tail;
    tail->prev=head;
}
c++ 复制代码
struct node{
    int val;
    int pre,next;
}nd[SIZE];
int head,tail,tot;

void initialize()
{
    tot=2;
    head=1;
    tail=2;
    nd[head].next=tail;
    nd[tail].pre=head;
}

1.邻接表

在与链表相关的数据结构中,邻接表是相当重要的一种。它是图与树一般化存储方式,还能用于实现我们将在下一节中介绍的开散列Hash表。实际上,邻接表可以看成"带有索引数组的多个数据链表"构成的结构集合。在这样的结构中存储的数据被分为若干类,每一类的数据构成一个链表。每一类还有一个代表元素,称为该类对应链表的"表头"。所有的表头构成一个表头数组,作为一个可以随机访问的索引,从而可以通过表头数组定位到某一类数据对应的链表。

一个有n个点m条边的有向图,可以如此存储:

c++ 复制代码
int tot;//边的总数
int ver[SIZE],edge[SIZE],next[SIZE],head[SIZE];
//分别记录每个边的终点,每个边的权值,把此边加入链表后的下一个边的序号,头结点指向的第一个边的序号


//加入有向边(x,y),权值为z
void add(int x,int y,int z)
{
    ver[++tot]=y,edge[tot]=z;
    next[tot]=head[x],head[x]=tot;
}

//访问从x出发的所有边
for(int i=head[x];i;i=next[i])
{
    int y=ver[i],z=edge[i];
}

例如插入6条边,顺序为(1,2),(2,3),(2,5),(3,5),(5,4),(5,1)。

对于无向图,我们可以把每条无向边看做两条有向边即可。我们可以利用第0x01学到的"成对变换"的位运算性质,程序开始时令tot=1,这样无向边便存储在veredge数组下标"2和3","4和5"...的位置上。通过对下标异或的操作,就可以直接定位到反向边。如果ver[i]是第i条边的终点,那么ver[i xor 1]则是第i条边的起点。

相关推荐
十五年专注C++开发10 小时前
VS2019编译的C++程序,在win10正常运行,在win7上Debug正常运行,Release运行报错0xC0000005,进不了main函数
开发语言·c++·报错c0x0000005
云里雾里!10 小时前
LeetCode 744. 寻找比目标字母大的最小字母 | 从低效到最优的二分解法优化
算法·leetcode
fy zs10 小时前
网络编程套接字
linux·服务器·网络·c++
yuanmenghao10 小时前
CAN系列 — (8) 为什么 Radar Object List 不适合“直接走 CAN 信号”
网络·数据结构·单片机·嵌入式硬件·自动驾驶·信息与通信
fpcc10 小时前
模板编程—模板和元编程中的错误输出
c++·模板编程
xie_pin_an10 小时前
C++ 类和对象全解析:从基础语法到高级特性
java·jvm·c++
小温冲冲10 小时前
C++与QML信号绑定完全指南:实现跨语言无缝通信
c++
GIS 数据栈10 小时前
【Seggis遥感系统升级】用C++高性能服务Drogon重构软件服务架构|QPS提升300%,性能再升级!
java·开发语言·c++·重构·架构
一条大祥脚10 小时前
26.1.3 快速幂+容斥 树上dp+快速幂 带前缀和的快速幂 正序转倒序 子序列自动机 线段树维护滑窗
数据结构·算法
2301_7806698610 小时前
List(特有方法、遍历方式、ArrayList底层原理、LinkedList底层原理,二者区别)
java·数据结构·后端·list