一、链表
数组模拟双向链表
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
| struct Node{ int value; int prev, next; }node[SIZE]; int head, tail, tot;
void initialize() { tot = 2; head = 1,tail = 2; node[head].next = tail; node[tail].prev = head; return ; } void insert(int p, int val) { q = ++tot; node[q].value = val; node[node[p].next].prev = q; node[q].next = node[p].next; node[p].next = q; return ; } void remove(int p) { node[node[p].prev].next = node[p].next; node[node[p].next].prev = node[p].prev; return ; } void clear() { memset(node, 0, sizeof(node)); head = tail = tot = 0; return ; }
|
二、二叉平衡树
三、邻接表
- 邻接表:带有索引数组的多个数据链表构成的结构集合;
- 在这样的结构中存储的数据被分成若干类,每一类的数据构成一个链表;
- 每一类数据有一个代表元素,成为该类数据对应链表的“表头”;
- 所有“表头”构成一个表头数组,作为一个可以随机访问的索引;
如上图所示,在插入新节点时,通过表头数组直接索引到对应数据类的链表处,并在链表表头处插入数据。
图论应用
1 2 3 4 5 6 7 8 9 10 11 12
| void add(int x,int y,int z) { ver[++tot] = y, edge[tot] = z; next[tot] = head[x],head[x] = tot; return ; }
for(int i = head[x];i;i = next[i]){ int y = ver[i],z = edge[i]; }
|
注解:
head
与 next
数组存储 ver
数组的下标,相当于指针,其中用 0
表示空;ver
数组存储每条边的终点,是真实数据;