数据结构与算法##2.线性表
一、什么是线性表
简称表,有穷序列(包括空表)
表目(元素)、索引(下标)、表的长度
特点:操作灵活,长度可变
1.结构和特点
B=(K,R) ; K={a0,a1,…,an-1} R={r}
开始节点 无钱去
结束节点 无后继
其他内部节点都有唯一的的直接前驱和后继 <ai,ai+1>
r为前驱和后继关系,具有反对称性和传递性
特点:
- 均匀性:同一线性表的各数据元素必定具有相同的数据类型和长度
- 有序性:各元素之间的相对位置是线性的
2.分类
按复杂程度
- 简单的:线性表、栈、队列、散列表
- 高级的:广义表、多维数组、文件
按访问方式
- 直接访问型
- 顺序访问型
- 目录索引型
按操作
- 线性表(按存储结构分顺序表,链表) 不限制操作
- 栈LIFO 在同一端操作
- 队列FIFO 在两端操作
3.线性表的运算
- 建立线性表
- 清除线性表
- 插入一个新元素
- 删除某个元素
- 修改某个元素
- 排序
- 检索
二、顺序表
向量,定长的一维数组存储结构
特性:
- 元素类型相同shuxu
- 元素顺序地存储在连续存储空间中,每一个元素都有唯一的索引值
- 使用常数作为向量长度
数组存储
读写元素很方便,通过下标定位,通过首地址进行随机存取
Li=L0+c*i,c为元素的地址空间大小
顺序表删除:后面的挨个往前移 O(n)
三、链表
存储节点=数据域+指针域(后继地址)
分类:单链、双链、循环链
单链表:简单的单链表、带头结点的单链表
对一个结点操作,必先找到它,即用一个指针指向它
找单链表中任一结点,都必须从第一个点开始
定位:O(n)
插入:O(n)+O(1)
删除:O(n)+O(1)
双链表:增加一个指向前驱的指针
循环链表:头尾节点链接起来,从循环表中任一结点出发,都能访问到表中其他节点
链表的边界条件:
几个特殊点的处理
- 头指针的处理
- 非循环链表尾结点的指针域保持为NULL
- 循环链表结点的指针回指头结点
链表处理
- 空链表的特殊处理
- 插入或删除结点时指针勾链的顺序
- 指针移动的正确性
四、顺序表和链表的比较
顺序表:
- 没有使用指针,不用花费额外花销
- 线性表元素的读访问非常简洁便利
- 插入、删除运算时间代价O(n),查找则可常数时间完成
- 如果整个数组元素很满,则没有结构性存储开销
链表:
- 无需事先了解线性表的长度
- 允许线性表的长度动态变化
- 能够适应经常插入删除内部元素的情况
- 插入、删除运算时间代价O(1),但找第i个元素运算时间代价O(n)
- 存储利用指针,动态地按照需要为表中新的元素分配存储空间
- 每个元素都有结构性存储开销
顺序表时存储静态数据地不二选择
链表是存储动态变化数据的良方
存储密度
空间需求:顺序表DE 链表n(P+E)
临界值 n>DE/(P+E)
顺序表不适用:
- 经常插入删除时,不宜使用顺序表
- 线性表的最大长度也是一个重要因素
链表不适用:
- 读操作比插入删除操作频率大,不应选择链表
- 当指针的存储开销和整个结点内容所占空间相比其比例较大时
选择顺序表:
- 结点总数目大概可以估计
- 线性表中结点比较稳定(插入删除少)
- n>DE/(P+E)
选择链表:
- 结点数目无法预知
- 线性表中结点动态变化(插入删除多)
- n<DE/(P+E)