「这是我参与2022首次更文挑战的第23天,活动详情查看:2022首次更文挑战」
前端能够用得到的数据存储结构之一:线性表
概念
- 数据元素类型相同(n 个 && n>0)
- 有限序列
- 有始有终(唯一的起始点 + 唯一的终止点)
- 第 2 ~ n 个元素都有直接前驱(唯一的)
- 第 1 ~ n-1 个元素都有直接后继(唯一的)
存储方式
- 顺序存储 —— 顺序表
- 链式存储 —— 链表
顺序表
- 逻辑上相邻的数据在计算机内的存储位置也是相邻的
- 存储:连续
- 优势:
- 根据索引可以快速查找
- 操作简单
- 存储密度高
- 劣势:
- 插入/删除时需要将其操作的元素后面的元素全都进行移动
- 分配空间方法:
- 静态分配
- 定长数组存储
- 最大空间(预先分配一段连续的空间——固定大小)
- length:元素个数(也称为顺序表的长度)
- 不足:合并/插入等操作过程中易溢出(超出预分配的空间长度)
- 动态分配
- elem 记录分配的空间的基地址(首地址)
- length:实际元素个数(顺序表的长度)
- 运算过程如果出现溢出的情况:另找一块更大的空间来代替原来的存储空间(扩充存储空间)
- 静态分配
- 查询操作的时间复杂度: O(1)
- 插入和删除操作的平均时间复杂度:O(n)
链表
- 单链表
- 节点组成:数据域(存储数据元素) + 指针域(下一个节点的地址)
- 查询:顺序存取 —— 单向操作(从头开始,一个一个地往后找)
- 插入:
- [e] -> 插入到 [i-1] 与 [i] 之间
- p 节点 -> [i-1] -> [i] ;
- s -> e
- 步骤
- s->next = p->next
- p->next = s
- 删除
- [i] -> 从 [i-1][i][i+1] 中删除
- p 节点 -> [i-1]
- q 节点 -> [i]
- 步骤
- p->next = q->next (原来的[i+1]的节点直接覆盖原来[i]的节点)
- 双向链表
- 节点组成:指针域(指向前驱节点) + 数据域(数据元素) + 指针域(指向后继节点)
- 查询:可以向前,也可以向后
- 插入:
- p->pre->next = s
- s->pre = p->pre
- s->next = p
- p->pre = s
- 删除
- p->pre->next = p->next
- p->next->pre = p->pre
- delete p
- 循环链表
- 环状:最后一个节点的后继指向头节点
- 空表:p->next = p->pre = p
- 优势:
- 动态存储,无需预先分配空间
- 插入删除操作无需移动元素
- 劣势:
- 存储密度低
- 存储元素需从头到尾顺序查找
- 静态链表
- [数据] [对应元素的后继下标]
- 插入
- 第 i 个元素前插入 89, 数组长度 len
- data[len] = 89
- right[i-1] = len , right[len] = i
- 删除
- 第 i 个元素
- right[i-1] = right[i+1] (直接跳过)