1.线性表的定义
线性表(List):由零分或多个数据元素组成的有限序列
强调关键地方:
- 首先它是一个序列,也就是说元素之间有个先来后到的关系,有顺序的。
- 若元素存在多个,则单元格元素无前驱,而最后一个元素无后继(有限序列),其他元素有且只有一个前驱和后继。
- 另外,线性表强调是有限的,事实上无论计算机发展多么强大,它所处理的元素都是有限的。
2.数学语言来进行定义
其中ai-1的前驱是ai-2,后继是ai
- 所有线性表元素的个数n( n >= 0 )定义线性表的长度,当n=0时,称为空表。
- 同一线性表中的元素必定具有相同特性,数据元素间等关系是线性关系。
1.线性表的抽象数据类型定义:
定义:是指一个数学模型以及定义在此模型上的一组操作。
结构描述:
ADT list{
数据对象:D={ai|ai属于Elemset,(i=1,2,3,……n,n>=0)
数据关系:R={<a(i-1),ai>|a(i-1),ai属于D,(i=1,2,3,……n)}
基本操作
InitList(*L);
ListInsert(*L,i,e);
DestroyList(*L);
ListDelete(L,i,e);
……等等
}ADT List
Initlist(*L)
操作结果:构造一个空的线性表
DestroyList(*L)
初始条件:线性表L已经存在
操作结果:销毁线性表L
ClearList(*L)
初始条件:线性表L已经存在
操作结果:将L表重置为空表
与销毁表不同的是,重置L之后其本身位置还在,而删除就是连本身也删除了
ListEmpty(L)
初始条件:线性表L已经存在。
操作结果:若线性表L为空表(n=0无元素),则返回true,否则返回false
ListLength(L)
初始条件:线性表L已经存在
操作结果:返回线性表L中的数据元素的个数,计算L表长度
GetElem(L,i,*e)
初始条件:线性表L已经存在,1 <= i <= ListLength(L) 大于第1个元素,小于最后一个元素
操作结果:用e返回线性表L中第i个数据元素的值
LocateElem(L,e,compare())
初始条件:线性表L已经存在,compare()是数据元素判断函数(判定=、>、<、元素e的元素,与e进行比较)。
操作结果:返回L中第1个与e满足compare()的数据元素的位序。若这样的数据元素不存在则返回值0
PriorElem(L,cur_e,*pre_e)
初始条件:线性表L已经存在
操作结果:若cur_e是L的数据元素,且不是第一个(第一个元素无前驱),则用pre_e返回它的前驱,否则操作失败;pre_e无意义
NextElem(L,cur_e,*next_e)
初始条件:线性表L已经存在
操作结果:若cur_e是L的数据元素,且不是最后一个(最后一个元素无后继),则用next_e返回它的后继,否则操作失败,next_无意义
ListInsert(*L,i,e)
初始条件:线性表L已经存在,1<=i<=ListLength(L)+1 可以插入在第1个元素的位置,或者最后一个元素之后的位置
操作结果:在L的第i个位置之前插入新的数据元素e,L的长度会加1
ListDelete(*L,i,*e)
初始条件:线性表L已经存在,1<=i<=ListLength(L)
操作结果:删除L的第i个数据元素,并用e返回其值,L的长度减一。
删除前(长度为n)
(a1,a2,……,a(i-1),ai,a(i+1),……,an)
删除后(长度为n-1)
(a1,a2……,a(i-1),a(i+1),……,an)
此时a(i-1)的后继就变成a(i+1)
ListTraverse(*L,visited())
对每个元素遍历一般
初始条件:线性表L已经存在
操作结果:一次对线性表中的每个元素调用visited()