线性结构:
顺序存储结构:数组。 需要先开辟内存。连续地址,读取方便,插入删掉复杂。
链式存储结构: 单链表、静态链表、循环链表、双向链表
单链表:地址随机,可能不连续。插入删除方便,读取不方便。单向的,头结点开始,依次指向后继元素。指向为空时,到达尾部
组成 | 头结点,指向下一个的地址 | 中间元素,指向下个地址 | 中间元素,指向下个地址 | 尾结点,指向空 |
data | null | 2 | 3 | 4 |
address | x0 | x1 | x2 | x3 |
pointer | 2 | 3 | 4 | null |
静态链表:静态列表是数组形式的一种伪装。初始给定足够的数组空间。每个空间中,包含,数据data,自己的数组下标index,和指向下一位置的游标cur。游标存放的是数组的下标。删除,插入操作时,更新游标,以完成目的。
规则:头结点游标 始终指向第一个空闲空间。 尾结点游标始终指向第一个有值的空间。 最后一个有值空间,游标指向头结点。删除插入操作后,要更新游标指向,数组内容顺序不变
data | null | null | null | null | null | null | null |
index | 0 | 1 | 2 | 3 | 4 | 5 | 6 |
cur | 1 | 2 | 3 | 4 | 5 | 6 | 0 |
加入一条数据操作之后状态 | |||||||
data | null | a | null | null | null | null | null |
index | 0 | 1 | 2 | 3 | 4 | 5 | 6 |
cur | 2 | 0 | 3 | 4 | 5 | 6 | 1 |
加入3条数据操作之后状态 | |||||||
data | null | a | b | c | null | null | null |
index | 0 | 1 | 2 | 3 | 4 | 5 | 6 |
cur | 4 | 2 | 3 | 0 | 5 | 6 | 1 |
在第2条数据前面插入1条数据操作之后状态 顺序 a d b c(0,1,4,2,3,5,6) | |||||||
data | null | a | b | c | d | null | null |
index | 0 | 1 | 2 | 3 | 4 | 5 | 6 |
cur | 5 | 4 | 3 | 0 | 2 | 6 | 1 |
删除第1条数据之后状态 实际顺序为:d b c (0,4,2,3,1,5,6) | |||||||
data | null | null | b | c | d | null | null |
index | 0 | 1 | 2 | 3 | 4 | 5 | 6 |
cur | 1 | 5 | 3 | 0 | 2 | 6 | 4 |
循环列表:循环列表就是把单向列表的未指针,指向了头元素。形成闭合的循环。用数组模拟如下:
data | null | a | b | c | d |
point (指向目标节点的地址) | a | b | c | d | null |
address self | x0 | x1 | x2 | x3 | x4 |
双向链表:双向链表就是把每个元素中,存放指向后续元素的指针,和上一个元素的指针。构成双向循环。数组模拟如下:
data | null | a | b | c | d | e |
point (指向next目标节点的地址) | a | b | c | d | e | null |
address self | x0 | x1 | x2 | x3 | x4 | x5 |
point(指向last目标节点的地址) | e | null | a | b | c | d |
对于链表的插入和删除操作:
单链表,只需将指向被删除元素的节点,修改为被删除元素指向的节点即可。同时,要释放被删除元素占用的内存:数组模拟,删除b元素 "()"内为注释,删除前状态
data | null | a | null(b) | c | d |
point (指向目标节点的元素) | a | c(b) | null(c) | d | null |
address self | x0 | x1 | null(x2) | x3 | x4 |
双向链表,将指向被删除元素的节点,修改为被删除元素指向的节点。将被删除元素指向的元素的指向上一个元素的节点,修改为被删除元素的指向上一个元素的节点。被删除元素的向前向后节点,置空,然后释放该元素。 数组模拟,删除b元素 "()"内为注释,删除前状态
data | null | a | null(b) | c | d | e |
point (指向next目标节点的地址) | a | c (b) | null(c) | d | e | null |
address self | x0 | x1 | null(x2) | x3 | x4 | x5 |
point(指向last目标节点的地址) | e | null | null(a) | a (b) | c | d |