【考研|数据结构严蔚敏清华大学出版社】2.1线性表的类型定义

文章介绍了线性表的特征和抽象数据类型ADTList,包括初始化、销毁、查找、遍历等操作。接着,提供了两个示例:如何通过线性表操作实现集合的并集以及两个已排序线性表的归并。这两个例子展示了线性表在数据处理中的应用。
摘要由CSDN通过智能技术生成

线性表

  • 线性结构特点:在数据元素的非空有限集 中,( 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

算法2.1
例2-2 已知线性表 LA 和 LB 中的数据元素按值非递减有序排列,现要求将 LA 和 LB 归并为一个新的线性表 LC ,且 LC 中的数据元素仍按值非递减有序排列。 例如,设 LA= (3,5,8,11) LB= (2,6,8,9,11,15,20) 则 LC= (2,3,5,6,8,8,9,11,11,15,20)

分析:由上述问可知,题目最后要将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={abab>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
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值