线性结构是一个数据元素的有序(次序)集---非数值上的有序
基本特征:1.集合中必存在唯一的一个“第一元素”
2.集合中必存在唯一的一个“最后元素”
3.除最后元素在外,均有唯一的后继
4.除第一个元素之外,均有唯一的前驱
2.1线性表的类型定义
抽象数据类型线性表的定义:
ADT List{
数据对象:
D={ai|ai∈ElemSet,i=1,2,……,n,n>=0}
{称n为线性表的表长,称n=0时的线性表为空表}
数据关系:
R1={<ai-1,ai>|ai-1,ai∈D,i=2,……n}
{设线性表为(a1,a2,.....,ai,.....an),称i为a在线性表中的位序}
}
基本操作:
1.结构初始化
InitList(&L) 构造一个空的线性表L
2.销毁结构
DestroyList(&L)
初始条件:L已存在 结果:销毁L
3.引用型操作----操作结果不改变结果
ListEmpty(L)空表返回true,否则返回false
ListLength(L)求长度
ListElem(L,cur_e,&pre_e) 若cur_e是L的元素,但不是第一个,pre_e返回它的前驱,否则操作失败
NextElem(L,cur_e,&next_e)若cur_e是L的元素,但不是最后一个,next_e返回它的后继,否则操作失败
GetElem(L,i,&e) 用e返回L第i个元素的值,(初始条件必须满足:保证i的参数在范围内---不需要再算法中实现)
LocateElem(L,e,compare())返回L中第一个与e满足关系compare()的元素的位序,若不存在这样的元素,则返回值为0
ListTraverse(L,visit()) 依次对L的每个元素调用visit()函数,一旦调用失败,则操作失败
4.加工型操作----结果改变结构
ClearList(&L) 将L重置为空表(前提:线性表L已存在)
PutElem(L,i,&e) L中第i个元素赋值为e 前提:i符合范围
ListInsert(&L,i,e) 在L的第i个元素之前插入e,L的长度增1 前提:1<=i<=原始长度+1
ListDelete(&L,i,&e) 删除L的第i个元素,并用e返回值,长度-1
5.更复杂的操作
例1:A=A∪B-----扩大线性表LA,将存在于线性表LB中而不存在于线性表LA中的数据元素插入到线性表LA中去
1)从线性表LB中一次取得每个数据元素GetElem(LB,i,&e) ----e
2)依值在线性表LA中进行查访LocateElem(LA,e,equal())
3)若不存在,则插入之ListInsert(&LA,i,e)
void union(List &La,List Lb){
La_len=ListLength(La);
Lb_len=ListLength(Lb);
for(i=1,i<=Lb_len;i++){
GetElem(Lb,i,e);//取Lb中第i个数据元素赋给e
if(!LocateElem(La,e,equal())
ListInsert(La,++La_len,e);//La中不存在和e相同的数据,插入之
}
}
例2:已知非纯集合B,试构造一个纯集合A,使A中只包含B中所有值各不相同的数据元素
算法一:A为空,在A中查找有无重复的值
void purge(List &