线性表1
一、线性表的定义和特点
线性表是具有相同特性的数据元素的一个有限序列 (a1,a2,a3,…,an)
定义:
线性表:由n(n>=0)个数据元素(结点)a1, a2, … , an组成的有限序列。
- 数据元素的个数n定义为表的长度
- 当n=0时称为空表
- 非空的线性表(n>0)记作:(a1, a2, … an)
线性表的例子
例1:分析26个英文字母组成的英文表 (A, B, C, D, … ,Z)
数据元素都是字母; 元素间关系是线性关系
例2:分析学生登记表
数据元素都是一条条的学生记录; 元素间关系是线性关系
例3:某单位历年拥有计算机的数量(6, 17, 28, 50, 92, 188)
数据元素都是整数; 元素间关系是线性的
线性表的逻辑特征:
同一线性表中的元素必定具有相同特性,数据元素间的关系是线性关系
第一个元素只有直接后继,最后一个元素只有一个直接前趋,其余元素有且仅有一个直接前趋和一个直接后继
二、案例引入
案例1:一元多项式的运算
一元多项式的运算:实现两个多项式加、减、乘运算
Pn(x) = p0 + p1x + p2x2 + … + pnxn
线性表 P = (p0, p1, p2, p3, … , pn) (x的指数和pi 的序号相同)
可用数组来表示
稀疏多项式 S(x) = 1 + 3x10000 + 2x20000
只存三项数据
顺序存储结构存在的问题:
存储空间分配不灵活,分配的空间是固定大小,有时会不够,有时会浪费
运算的空间复杂度高,还用了新数组C
链式存储结构
三、线性表的类型定义
抽象数据类型定义格式:
ADT 抽象数据类型名{
数据对象:<数据对象的定义>
数据关系:<数据关系的定义>
基本操作:<数据关系的定义>
}ADT 抽象数据类型名
线性表的抽象数据类型定义:
基本操作:
①InitList(&L) 线性表初始化
操作结果:构造一个空的线性表L
②DestroyList(&L) 销毁线性表
初始条件:线性表L已存在
操作结果:销毁线性表L
③ClearList(&L) 清空线性表
初始条件:线性表L已存在
操作结果:将L重置为空表,填0
④ListEmpty(L) 判断线性表L是否为空表
初始条件:线性表L已存在
操作结果:若L为空表(元素个数n=0),则返回true,否则返回false
⑤ListLength(L) 求线性表的长度n
初始条件:线性表L已存在
操作结果:返回线性表L中的数据元素个数
⑥GetElem(L, i, &e) 获取元素
初始条件:线性表L已存在, 且1<=i<=ListLength(L)
操作结果:用e返回线性表L中第i个数据元素的值
注意:线性表是从a1开始,不是a0
⑦LocateElem(L, e, compare()) 查找定位元素
初始条件:线性表L已存在,compare()是数据元素判定函数(相等、小于、大于…)
操作结果:返回L中第1个与e满足compare()的数据元素的位序。若这样的数据元素不存在则返回0
⑧PriorElem(L, cur_e, &pre_e) 获得当前元素cur_e的前趋
初始条件:线性表L已经存在
操作结果:若cur_e是L的数据元素,且不是第一个,则pre_e返回其其前趋,否则操作失败,pre_e无意义
⑨NextElem(L, cur_e, &next_e) 获得当前元素cur_e的后继
初始条件:线性表L已经存在
操作结果:若当前元素cur_e是L的数据元素,且不是最后一个,则用next_e返回其后继,否则操作失败,next_e无意义
⑩ListInsert(&L,i,e) 插入元素e
初始条件:线性表L已存在,且1<=i<=ListLength(L)+1(插在最后一个元素的后面)
操作结果:在L中第i个位置之前插入新的数据元素e,L的长度加1
⑪ListDelete(&L, i) 删除元素
初始条件:线性表L已存在且非空,且1<=i<=ListLength(L)
操作结果:删除L的第i个数据元素,L的长度减1
⑫ListTraverse(&L, visited()) (traverse:遍历)
初始条件:线性表L已存在
操作结果:依次对线性表L中的每个元素调用visited()