线性表的的定义
- 线性表元素个数有限;
- 线性表元素的数据类型相同;
- 第一个元素只有一个直接后继,最后一个元素只有一个直接前继,其他中间元素有且只有一个直接前继和直接后继;
线性表的抽象数据类型
- 基本操作:初始化、判空、清空、返回某一元素、插入和删除某一元素等
线性表的顺序存储结构
- 即线性表的数据元素用一段地址连续的存储单元依次存储;
- 一维数组可以用来实现线性表的顺序存储,但须注意数组长度不等于线性表长度,通常数组长度 >= 线性表长度
- 注意,线性表的第一位称为
a1
,存放在数组的a0
位; - 该存储方式使得线性表中任意一位的地址都可以通过第一位元素地址获取且时间复杂度均为0(1),具有这种存储特点的存储结构成为随机存储结构;
顺序存储结构的插入与删除
- 插入到位置i,则需要从最后一位开始每个元素往后移动一位,让i+1到n的元素均往后移一位,时间复杂度为O(n)
- 删除位置i上的元素,则需要让i+1到n的元素均往前移一位,时间复杂度为O(n)
顺序存储的优缺点
- 优点:无需为元素箭的逻辑关系增加额外的存储空间;可以快速获取表中任意位置的元素
- 缺点:插入和删除操作需要移动大量元素;当线性表长度变化大时难以确定存储空间容量;造成存储空间的碎片
线性表的链式存储结构
线性表链式存储结构定义
- 来源:为解决顺序存储删除插入的缺点,引入链式存储,即不让元素的存储位置一个挨着一个
- 定义:链式存储结构中,每一个元素存储地址可以是连续的也可以是不连续的,每一个元素不仅要存储自己的信息(数据域),还有存储其直接后继的位置信息(指针域),两部分信息组成数据元素的存储映像,称为结点Node。
- 假设
p
是用来指向线性表的第i
个元素的指针,则p->data
表示该结点的数据,p->next
用来表示ai
的指针域,即表示下一个结点的存储位置 - 每个结点只包含一个指针域,故又被称为单链表;
链式存储的注意事项
- 为了指示第一个结点,一般会引入头结点(不是必须存在的),其数据域一般不存储信息,其指针域用来存放第一个结点的地址信息,而该位置信息又被称为头指针
- 最后一个结点的指针为空
单链表结构与顺序存储结构优缺点
链表 | 存储方式 | 时间性能 | 空间性能 |
---|---|---|---|
顺序存储 | 用一段连续的存储单元依次存储线性表元素 | 查找:o(1) ;插入和删除:o(n) | 需要预分配存储空间 |
单链表 | 用一组任意的存储但愿存放 | 查找:o(n) ;插入和删除:o(1) | 无需提前分配且元素个数不受限 |
即:频繁查找选顺序结构存储;频繁插入和删除选单链表
静态链表
- 有些语言没有指针,故又要实现单链表的能力,静态链表就可以实现,每一个数组元素及存储当前元素又存储下一个元素的下标
- 优点:插入和删除不需要移动元素只需要修改存储的下标
- 缺点:未解决连续存储表长不确定的问题;失去了顺序存储的随机存取特性
循环链表
- 单链表中终端节点的指针由指向空指针变成指向头结点的指针
- 解决:从任意结点出发均可访问链表所有结点
- 注意:判断链表循环结束的标示是
p->next == 头结点
双向链表
- 顾名思义一个结点除了数据域还包括两个指针域,一个指向前继结点一个指向后继结点