线性表(Linear List):
由n(n>=0)个数据元素(结点)a1,a2,…,an组成的有限序列。
线性表是具有相同特性的数据元素的一个有限序
表的内容称为数据元素
N为数据元素的个数
N=0为空表 N!=0时 表记作(a1,a2,a3,****,an)
其中 a1线性起点(起始节点)
an线性终点(终端节点)
ai-1是ai的直接前趋 ai+1是ai的直接后继
下标是元素的序号 表示元素在表中的位置
EP: 英文表(A,B,C,D,…,Z)
数据元素是字母 元素间关系是线性的
线性表的特征:
非空线性表:
有且只有一个开始结点a1,他没有直接前趋,有且只有一个直接后继a2。
有且只有一个终端结点an,他有且只有一个直接前趋an-1,没有直接后继。
其余内部结点ai(2<=i<=n-1)都有且只有一个直接前趋和直接后继。
案例引入 1.一元多项式的运算:实现两个多项式的加,减,乘运算。
Rn(x)=Pn(x)+Qn(x) 线性表R=(p0+q0,p1+q1,...,pn+qn)
2.稀疏多项式
只记录用到的系数和次数
P=((p1,e1),(p2,e2),…,(pn,en))分别对每个相加的表从头遍历每一项指数相同 对应系数相加 若和不为0,则新表增加一个新项指数不同 则将指数较小的项复制到新表中
顺序存储结构存在的问题:
存储空间分配不灵活 &运算的空间复杂度高
3.信息管理系统需要功能: 插找 插入 删除 修改 排序 计数
图书表抽象为线性表 每本图书抽象线性表中的数据元素
线性表的抽象数据类型操作集合
线性表的类型定义ADT
List
{
数据对象: D={ai|ai属于Elemset}
数据关系: R={<ai-1,ai>}有序
基本操作:InitList(&L);
Destroy(&L);
ListInsert(&L,i,e);
ListDelete(&L,i,&e);等等…
}ADT List
操作列举
InitList(&L)(Initialization List)
操作结果:构造一个空的线性表L
DestroyList(&L)
初始条件:线性表L已存在
操作结果:销毁线性表L
ClearList(&L)
初始条件:线性表L已存在
操作结果:将L重置为空表
ListEmpty(L)
初始条件:线性表L已存在
操作结果:若L为空表 返回TRUE 否则 返回FALSE
ListLength(L)
初始条件:线性表L已经存在
操作结果: 返回线性表L中元素的个数
GetElem(L,i,&e)
初始条件:线性表L已存在,i<=i<=ListLength(L)
操作结果:用e返回线性表L中第i个数据元素的值
LocateElem(L,e,compare())
初始条件:线性表已经存在 compare()数据元素判断函数
操作结果: 返回线性表L中第一个与e满足compare()的数据元素的位序,如果不存在则返回0
PriorElem(L,cur_e,&pre_e)
初始条件 L已存在
操作结果 若cur_e是L的数据元素,且不是第一个,则用pre_e返回它的前趋 否则操作无意义
NextElem(L,cur_e,&next_e)
初始条件 L已存在
操作结果 若cur_e是L的数据元素,且不是最后一个,则用next_e返回它的后继,否则操作无意义
ListInsert(&L,i,e)
初始条件 L已存在,1<=i<=ListLength(L)+1
操作结果 在L的第i个位置之前插入新的数据元素e,L的长度加一
ListDelete(&L,i,&e)
初始条件 L已存在,1<=i<=ListLength(L)
操作结果 删除第i个数据元素 并用e返回其值,L的长度减一。
ListTraverse(&L,visited())
初始条件:L已存在
操作结果:依次对线性表中每个元素调用visited()
以上为线性表 逻辑结构上定义的运算。提出了做什么 后面需要在已知做什么后解决如何做。