数据结构-线性表
2.1线性表的定义和基本操作
线性表是一种典型的线性结构。
- 存在一个唯一的被称为“第一个”的数据元素;
- 存在一个唯一的被称为“最后一个”的数据元素;
- 除第一个元素外,每个元素均有唯一一个直接前驱;
- 除最后一个元素外,每个元素均有唯一一个直接后继。
线性表(Linear List):是由n(n>=0)个数据元素(结点)a1,a2,…,an组成的有限序列。
所有节点具有相同的数据类型。
数据元素的个数n称为线性表的长度。
- 当n=0时,称为空表。
- 当n>0时,将非空的线性表记作:(a1,a2,…,an)a1称为线性表的第一个结点,an称为线性表的最后一个结点。
- a1,a2,…,ai-1都是ai(2<=i<=n)的前驱,其中ai-1是ai的直接前驱;
- ai+1,ai+2,…,an都是ai(1<=i<=n-1)的后继,其中ai+1是ai的直接后驱。
- 若线性表中的结点是按值由小到大(或大到小)排列的,称线性表是有序的。
- 线性表是一种相当灵活的数据结构,其长度可根据需要增长或缩短。
- 对线性表的数据元素可以访问,插入和删除。
线性表的抽象数据类型定义:
ListLength(L)
初始条件:线性表L已存在;
操作结果:若L为空表,则返回TRUE,否则FALSE
GetElem(L,i,&e)
初始条件:线性表L已存在,1<=i<=Listlength(L)
操作结果:用e返回L中的第i个数据元素的值;
ListInsert(L,i,&e)
初始条件:线性表L已存在,1<=i<=ListLength(L)
操作结果:在线性表L中的第i个位置插入元素e;
LocElem(LA,e,equal())
初始条件:线性表L已存在,1<=i<=ListLength(L)
操作结果:在线性表L中查找是否存在元素e;
例1 假设:有两个集合A和B分别用两个线性表LA和LB表示,即:线性表中的数据元素即为集合中的成员。现要求一个新的集合A = A∪B。
上述问题可演绎为如下操作:
- 扩大线性表LA,将存在于线性表LB中而不存在于线性表LA中的数据元素插入到线性表LA中
操作步骤:
-
从线性表LB中依次查看每个数据元素;
GetElem(LB,i)➡e
-
依次在线性表LA中进行查访;
LocElem(LA,e,equal())
-
若不存在,则插入。
ListInsert(LA,n+1,e)(n表示线性表LA当前长度)
void union(List La,List Lb){
//将所有在线性表Lb中但不在La中的数据元素插入到La中
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相同的数据元素,则插入
}//union
}
例2 归并两个“其数据元素按值非递减有序排列”的有序表LA和LB,求得有序表LC也具有相同特性。
LA = (3,5,8,11)
LB = (2,6,8,9,11,15,20)
则LC =(2,3,5,6,8,89,11,11,15,20)
操作步骤:
- 初始化LC为空表;
- 分别从LA和LB中取得当前元素ai和bj;
- 若ai<=bj;则将ai插入到LC中,否则将bj插入到LC中;
- 重复2和3两步,直至LA或LB中元素被取完为止;
- 将LA表或LB表中剩余元素复制插入到LC表中。
void MergeList(List La,List Lb,List Lc){
InitList(Lc);
i = j = 1, k = 0;
La_len = ListLength(La);La_len = ListLength(Lb);
//获取La表和Lb表的长度
while((i<=ListLength)&&(j<=Lb_len)){//La和Lb均非空
GetElem(La,i,a);GetElem(Lb,j,bj);
if (ai<=bj){ ListInsert(Lc,++k,ai); ++i , }
//如果ai<=bj,则把ai插入到Lc中,然后将i移动到下一位
else{ ListInsert(Lc,++k,bj),++j, }
//否则,把bj插入到Lc中,然后将j移动到下一位
while(i<=La_len){
//如果Lb已经完全遍历完了,则此时只遍历La表
GetElem(La,i++,ai);ListInsert(Lc,++k,ai);
}
while(j<=lb_len){
//如果La已经完全遍历完了,则此时只遍历Lb表
GetElem(Lb,j++,bj);ListInsert(Lc,++k,bj);
}//结束
}//MergeList