- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2. 表示形式
通常表示成下列形式: L=( a1, a2,...,ai-1,ai,ai+1,...,an) 其中:L为线性表名称,习惯用大写书写; ai为组成该线性表的数据元素,习惯用小写书写;数据元 素ai(1≦i≦n)只是一个抽象的符号,其具体含义在不同的 情况下可以不同。 线性表中数据元素的个数被称为线性表的长度,当n=0时, 线性表为空,又称为空线性表。 在非空表中每个数据元素都 有一个确定的位置。ai是第i个数据元素,称i为数据元素ai在 线性表中的位序。
二 线性表的抽象数据类型
1.定义 抽象数据类型线性表的定义如下:
线性表的抽象数据类型的定义
• ADT List { 数据对象:D={ai | ai ∈ ElemSet, i=1,2,...,n, n≥0 } 数据关系:R1={ <ai-1 ,ai >| ai-1,ai∈D, i=2,...,n } 基本操作: {结构初始化} InitList( &L ) 操作结果:构造一个空的线性表 L 。 {销毁结构} DestroyList( &L ) 初始条件:线性表 L 已存在。 操作结果:销毁线性表 L 。
listinsert(lc,++k,ai); ++i; } 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); } // 该算法的时间复杂度为: } // ListLength(Lb)); O(ListLength(La)+ ListLength(Lb));
• 1)初始化:置LC表为空表。设置变量i,j, 初值为1,分别表示LA和LB的的一个元 素。k表示LC的长度,初值为0; • 2)当i<=length(LA)并且j<=length(LB)时, 判断:若i所指的元素<=j所指的元素,则 将i所指的元素插入到LC的k+1位置,并 且i的值加1.否则,将j所指的元素插入到 LC的k+1位置,并且j的值加1. • 3)重复2直到某个表的元素插入完毕 • 4)将未插入完的表余下的元素,依次插 入到LC后。
插入、删除运算的实现和其时间复杂度分析
顺序表上
•基本运算构造出较复杂的运算;
算的时间复杂度分析
顺序表上插入、删除运
一.线性表的定义
1. 定义 线性表是由n(n≥0)个类型相同的数据元素组成的有 限序列。 1) 线性表长度是有限的 2) 线性表长度可以为0 所有数据元素的类型必须相同 它有四个基本特征: 1.集合中必存在唯一的一个"第一元素"; 2.集合中必存在唯一的一个"最后元素"; 3.除最后元素之外,其它数据元素均有唯一的"后继" ; 4.除第一元素之外,其它数据元素均有唯一的"前驱"
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); if(!LocateElem(La,e,equal)) ListInsert(La, ++La_len, e);} }//union 算法2.1的时间复杂度为 算法 O(ListLength(La)×ListLength(Lb));
struct bookinfo{ int No; //图书编号 char *name; //图书名称 char *auther; //作者名称 ...; }
4.逻辑特征 从以上例子可看出线性表的逻辑特征是: 1)、在非空的线性表,有且仅有一个开始结点a1,它没有 直接前趋,而仅有一个直接后继a2; 2)、有且仅有一个终端结点an,它没有直接后继,而仅有 一个直接前趋an-1; 3)、其余的内部结点ai(2≦i≦n-1)都有且仅有一个直接 前趋ai-1和一个直接后继ai+1。 线性表是一种典型的线性结构。
此问题的算法如下: void mergelist(list la,list lb,list &lc) { initlist(lc); i=j=1;k=0; la-len=listlength(la); lb-len=listlength(lb); while((I<=la-len)&&(j<=lb-len)) { getelem(la,I,ai); getelem(lb,j,bj); if(ai<=bj) {
3. 举例 26个英文字母组成的字母表(A,B,C、…、Z)数据元 素类型为char La=(34,89,765,12,90,-34,22)数据元素类型为 int。 Ls=(Hello2, World2, China2, Welcome2) 数据元素类 型为string。 Lb=(book1,book2,...,book100) 数据元素类型为下列所 示的结构类型:
• {引用型操作} ListEmpty( L ) 初始条件:线性表L已存在。 操作结果:若 L 为空表,则返回 TRUE,否则返 回 FALSE。 ListLength( L ) 初始条件:线性表 L 已存在。 操作结果:返回 L 中元素个数。 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 返回它的后继,否则的算法实现
1. 初始化线性表L 初始化线性表L
int InitList(SEQLIST *L) { L->elem=(Elemtype*)malloc(LIST_MAX_LENGTH *sizeof(Elemtype)); //分配空间 if (L->elem==NULL) return ERROR; //若分配空间不成功 ,返回ERROR L->length=0; //将当前线性表长度置0 return OK; //成功返回OK }
三、线性表的顺序存储结构
1. 线性表的顺序存储结构 线性表的顺序存储结构是指用一组连续的存储单元依次存 储线性表中的每个数据元素。如下图所示:
内存状态 b a1 b+ι a2 …… …… b+(i-1)*ι ai …… b+(n-1)*ι an
存储地址
位序 1 2 i n
注意: (1)L为每个数据元素所占据的存储单元数目。 (2)相邻两个数据元素的存储位置计算公式 LOC(ai+1)=LOC(ai)+L i+1 (3)线性表中任意一个数据元素的存储位置的计算公式为: LOC(ai+1)=LOC(a1)+(i-1)*L )+(ii+1
• 例2 已知一个“非纯集合” B,试构造一 个集合 A,使 A 中只包含 B 中所有值各 不相同的数据元素。 • 分析:将每个从 B 中取出的元素和已经加 入到集合 A 中的元素相比较。
• void purge(List &LA, List LB) { // 构造线性表LA,使其只包含LB中所有值不相同 的数据元素,算法不改变线性表LB InitList(LA); // 创建一个空的线性表 LA La_len = 0; Lb_len = ListLength(LB); // 求线性表 LB 的长度 for (i = 1; i <= Lb_len; i++)// 处理 LB 中每个元素 { GetElem(LB, i, e); // 取LB中第 i 个数据赋给 e // 当 LA 中没有和 e 值相同的数据元素时进行插 入 if (!LocateElem( LA, e, equal( ) ) ListInsert( LA, ++La_len, e ); } // for } // purge
2.顺序存储结构的特点 (1) 利用数据元素的存储位置表示线性表中相邻数据 元素之间的前后关系,即线性表的逻辑结构与存储结构( 物理结构)一致;在访问线性表时,可以利用上述给出的 数学公式,快速地计算出任何一个数据元素的存储地址。 因此,我们可以粗略地认为,访问每个数据元素所花费的 时间相等。这种存取元素的方法被称为随机存取法,使用 这种存取方法的存储结构被称为随机存储结构。
第三讲
第二章 线性表
线性表的类型定义,线性表的抽象数据类型 线性表的类型定义,线性表的抽象数据类型, 顺序表中基本运算的实现 知识要点: 知识要点:
•理解线性表的定义和逻辑特征;掌握线性表的抽象数据类
型定义;运用线性表的基本操作;顺序表的定义、组织形式、结 构特征和类型说明及基本操作的实现
•线性表的逻辑特征;线性表的基本操作的运用;
• {加工型操作} ClearList( &L ) 初始条件:线性表 L 已存在。 操作结果:将 L 重置为空表。 PutElem( &L, i, &e ) 初始条件:线性表L已存在,1≤i≤LengthList(L)。 操作结果:L 中第 i 个元素赋值同 e 的值。 ListInsert( &L, i, e ) 初始条件:线性表 L 已存在,1≤i≤LengthList(L)+1。 操作结果:在 L 的第 i 个元素之前插入新的元素 e, L 的长度增1。 ListDelete( &L, i, &e ) 初始条件:线性表 L 已存在且非空, 1≤i≤LengthList(L)。 操作结果:删除 L 的第 i 个元素,并用 e 返回其值, L 的长度减1。 } ADT List