链表和顺序表储存时各自有什么优点?

1. 顺序表存储(example: 数组)

  1. 定义

顺序表存储是将元素放到一块连续的内存存储空间, 相邻数据元素的存放地址页相邻(逻辑与物理统一)

  2. 优点

(1) 空间利用率高. (局部性原理, 连续存放, 命中率高)

(2) 存取速度高效, 通过下标来直接存储

  3. 缺点

(1) 插入和删除比较慢 ---- 插入或删除一个元素时, 整个表需要遍历移动元素来重新排序

(2) 有空间限制, 会出现溢出问题, 当元素个数远少于预先分配的空间时, 空间浪费巨大

  4. 时间性能

查找o(1), 插入和删除o(n)

2. 链表存储

  1. 定义

链表存储是在程序运行过程中动态的分配空间, 只要存储器还有空间, 就不会发生溢出问题, 相邻数据元素可以随意存放, 但所占存储空间分为两部分, 一部分存放结点值, 另一部分存放表示结点关系间的指针

  2. 优点

(1) 存取某个元素的速度慢

(2) 插入和删除的速度快, 保存原有的屋里顺序, 插入或删除一个元素时, 只需要改变指针方向即可

(3) 没有空间限制,存储元素的个数无上限, 基本只与内存空间的大小有关

  3. 缺点

(1) 占用额外空间以存储指针(浪费时间, 不连续存放, malloc开辟, 空间碎片多)

(2) 查找速度慢, 因为查找时, 需要循环链表访问, 需要从开始结点一个一个结点去查找元素访问

  4. 时间性能

查找o(n), 插入和删除o(1)

3. 注意

  1. 频繁的查找却很少插入和删除操作可以使用顺序表存储, 堆排序, 二分法查找适用于顺序表
  2. 如果频繁的插入和删除操作很少的查询就可以使用链表
  3. 顺序表适用于查找静态操作, 链表适用于做插入, 删除这样的动态操作
  4. 若线性表长度变化不大, 如果事先知道线性表的大致长度, 且其主要操作是查找, 则采用顺序表; 若线性表长度变化较大或根本不知道多大时, 且其主要操作是插入, 删除, 则采用链表, 这样可以不需要考虑存储空间的大小问题