数据结构_链表及邻接表
单链表
两种形式
结构体形式 : 申请新节点太慢
struct List { int data; List *next; }
数组模拟
代码模板
const int N = 1e6 + 10; int e[N], ne[N], head, idx; // 初始化:head存的是头结点下标,用idx分配空间 void init() { head = -1; idx = 0; } // 头插法 void add_to_head(int x) { e[idx] = x; n[idx] = head; head = idx; idx++; } // 删除节点 void del(int k) { n[k] = n[n[k]]; } // 在第k个插入的数后插入一个数 void add(int k, int x) { e[idx] = x; n[idx] = n[k]; n[k] = idx; idx++; } void display() { for(int i = head; i != -1; i = ne[i) printf("%d ", e[i]); }
双链表(用于优化)
代码模板
const int N = 1e6 + 10; int e[N], l[N], r[N], idx; void insert(int a, int x) { e[idx] = x; l[idx] = a, r[idx] = r[a]; l[r[a]] = idx, r[a] = idx ++ ; } // 删除节点a void remove(int a) { l[r[a]] = l[a]; r[l[a]] = r[a]; }
邻接表
代码模板
const int N = 1e6 + 10; int e[N], ne[N], h[N], idx; void init() { memset(h, -1, sizeof h); idx = 0; } // 加边:(a, b)表示由a指向b void add(int a, int b) { e[idx] = b, ne[idx] = h[a], h[a] = idx++; } // 遍历: 表示以ver指向的节点 void travel(int r) { for(int i = h[ver]; i != -1; i = ne[i]) printf("%d", e[i]); }
相关推荐
koushr 2020-11-12
范范 2020-10-28
qiangde 2020-09-13
范范 2020-07-30
mingyunxiaohai 2020-07-19
zhaochen00 2020-10-13
Mars的自语 2020-09-27
steeven 2020-09-18
kka 2020-09-14
聚沙成塔积水成渊 2020-08-16
earthhouge 2020-08-15
aanndd 2020-08-12
bluetears 2020-07-28
horizonheart 2020-07-19
liushall 2020-07-18
bluetears 2020-07-05
fengshantao 2020-07-02
liuweixiao0 2020-06-27