| 数组模拟 | 传统结构体版 | 含义 |
|---|---|---|
h[u] | head | 指向第一条边的指针 |
ne[i] | ptr->next | 指向下一条边的指针 |
e[i] | ptr->val | 当前边指向的具体节点 |
- 数组模拟的h数组以及ne数组存储的是指针,也可以理解为指向元素的边;只有通过e数组才能得到对象的值;idx表示用到哪个节点
- 而传统结构体则更为直接,可直接通过->next->val操作访问下一元素的值
例如
//访问头节点指向元素
head->next->val//传统结构体
e[h[u]]//数组模拟
//访问第二个元素
head->next->next->val//传统结构体
e[ne[h[u]]]//数组模拟
头插法辨析应用
#include<bits/stdc++.h>
using namespace std;
const int N =1e6 + 10;
//数组模拟(邻接表为例,刚好学到这hh)
int h[N], ne[N], e[N], idx;
void add(int a, int b)
{
e[idx] = b;
ne[idx] = h[a];
h[a] = idx++;
}
//传统结构体(🥱)
struct Node
{
int val;
Node *next;
// 构造函数x为元素值,y为指向的指针
Node(int x, Node *y) : val(x), next(y) {};
};
Node *h1[N];
// 初始化
void init(int n)
{
for (int i = 1; i <= n; i++)
h1[i] = nullptr;
}
void add(int a, int b)
{
// 创建新节点并指向h[a]
Node *p = new Node(b, h1[a]);
// 更新头指针
h1[a] = p;
}
| 步骤描述 | **数组模拟 ** | 传统结构体指针版 |
|---|---|---|
| 创建新“地址” | idx (自增索引) | new Node (堆内存地址) |
| 存入数据 | e[idx] = b; | p->val = b; |
| 指向当前的头 | ne[idx] = h[a]; | p->next = h[a]; |
| 更新头指针 | h[a] = idx++; | h[a] = p; |