线性表
- 线性结构特点:在数据元素的非空有限集 中,( 1 )存在惟一的一个被称做“第一个"的数据元素; ( 2 )存在惟一的一个被称做“最后 一个"的数据元素; ( 3 )除第一个之外,集合中的每个数据元素均只有一个前驱; ( 4 )除最 后一个之外,集合中每个数据元素均只有一个后继。
线性表的类型定义
一个数据元素可以由若干个数据项 (item) 组成。在这种情况 下,常把数据元素称为记录 (record) ,含有大量记录的线性表又称文件 (file) 。
由n个数据特性相同的元素构成的有限序列称为线性表
线性表中元素的个数n(n>=0)定义为线性表的长度,n=0时称为空表
ADT List{
数据对象: D={ai|ai∈ElemSet, i=l, 2, ..., n, n>=0}
数据关系:R=(<ai-1 ,ai>| ai-1,ai∈D, i=2, ..., n}
基本操作:
Ini tList (&L)
操作结果:构造一个空的线性表L。
DestroyList(&L)
初始条件:线性表L已存在。
操作结果:销毁线性表L。
ClearList(&L)
初始条件:线性表L已存在。
操作结果:将L重置为空表。
ListEmpty(L)
初始条件:线性表L已存在。
操作结果:若L为空表,则返回true,否则返回 false。
ListLength(L)
初始条件:线性表L已存在。
操作结果:返回L中数据元素个数。
GetElem(L,i,&e)
初始条件:线性表L巳存在,且1<=i<=ListLength (L)。
操作结果:用e返回L中第i个数据元素的值。
LocateElem(L,e)
初始条件:线性表L已存在。
操作结果:返回L中第1个 值与e相同的元素在 L中的位置。若这样的数据元素不存在 ,则返回值为0。
PriorElem(r,,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_e无定义。
Listinsert(&L,i,e)
初始条件:线性表L已存在,且1<=i<=ListLength(L) +1。
操作结果:在L中第i个位置之前插入新的数据元素 e, L的长度加1.
ListDelete(&L,i)
初始条件:线性表L已存在且非空 ,且l<=i<=ListLength(L)。
操作结果:删除L的第1个数据元素,L的长度减1。
TraverseList(L)
初始条件:线性表L已存在。
操作结果:对线性表L进行遍历,在遍历过程中对L的每个结点访问一次。 } ADT List
例2-1 假设利用两个线性表 LA 和 LB 分别表示两个集合 A 和 B (即线性表中的数 据元素即为集合中的成员),现要求一个新的集合 A=AUB 。
分析:这就要求对线性表作如下 操作:扩大线性表 LA ,将存在于线性表 LB 中而不存在于线性表 LA 中的数据元素插入 到线性表 LA 中去。只要从线性表 LB 中依次取得每个数据元素,并依值在线性表 LA 中 进行查访,若不存在,则插入之。上述操作过程可用下列算法描述之。
void union(List &La,List Lb){
//因为要改变线性表a所以将线性表a设为引用型
//将所有Lb中特有的元素插入到La中
La_len=ListLength(La); Lb_len=ListLength(Lb); //求La和Lb的长度
for(i=1;i<=Lb_len;i++){ //初始化i,在Lb的长度范围下,遍历Lb
GetElem(Lb,i,e); // 取Lb中第i个数据元素赋给e
if(!LocateElem(La,e,equal)) ListInsert(La,++La_len,e);
//La中不存在和e相同的数据元素,则插入
//++La_Len 表示参数 La_Len 的值先增 1 ,然后再传递给函数
}
}//union
分析:由上述问可知,题目最后要将LA和LB中的元素都以非递减有序排列的形式防止在LC中。所以先将LC置为空表,由于LA和LB是非递减的,所以取LA,LB最小的元素比较,插入LC中。要使LC中的元素按值非递减有序排列,设两个指针i,j分别指向LA和LB中某个元素,若设i当前所指的元素为 a,j 当前所指的元素为 b ,则当前应插入到 LC 中的元素 c 为
c
=
{
a
a
≤
b
b
>
b
c = \{ \begin{array} { l l } { a } & { a \leq b } \\ { b } & { \gt b } \end{array}
c={aba≤b>b
由于i,j分别指向LA和LB中的元素,所以指针i和指针j的初值均为1,在所值元素插入LC之后,在LA或LB中顺序后移。
void MergList(List La,List Lb,List &Lc){
//已知线性表La和Lb中的数据元素按值非递减排列
//归并La和Lb得到新的线性表Lc,Lc的数据元素也安置非递减排列
InitList(Lc); //创建一个空的线性表
i=j=1;k=0; //初始化i j k
La_len=ListLength(La); Lb_len=ListLength(Lb); //设置La和Lb的长度
while((i<=La_len)&&(j<=Lb_len)){//La和Lb均非空
GetElem(La,i,ai); GetELem(Lb,j,bj); //ai返回La中第i个元素的值 bj返回Lb中第j个元素的值
if(ai<=bj) {ListInsert(Lc,++k,ai);++i;} //如果ai小于bj,在Lc的++k的位置之前插入ai,Lc长度加1
else{ListInsert(Lc,++k,bj);++j;}
}
while(i<=la_len){
GetElem(La,i++,ai);ListInsert(Lc,++k,ai);
}
while(j<=Lb_len){
GetElem(Lb,j++,bj);ListInsert(Lc,++k,bj);
}
}//HergeList