数据结构(严蔚敏)课件第2章.ppt
《数据结构(严蔚敏)课件第2章.ppt》由会员分享,可在线阅读,更多相关《数据结构(严蔚敏)课件第2章.ppt(119页珍藏版)》请在冰豆网上搜索。
![数据结构(严蔚敏)课件第2章.ppt](https://file1.bdocx.com/fileroot1/2022-10/19/37d26932-1ace-4a2f-beca-99e78f4fc5cb/37d26932-1ace-4a2f-beca-99e78f4fc5cb1.gif)
第二章第二章线性表线性表11/5/2022第页【课前思考课前思考】1.抽象数据类型的定义由哪几部分组成?
抽象数据类型的定义由哪几部分组成?
数据对象、数据关系和基本操作三部分。
2.按数据元素之间的逻辑关系不同,数据结构有哪几类?
按数据元素之间的逻辑关系不同,数据结构有哪几类?
线性结构、树型结构、图状结构和集合四类。
3.你能举出几个你熟悉的你能举出几个你熟悉的序列序列的例子来吗?
的例子来吗?
如:
0,1,2,9,A,B,C,Z。
11/5/2022第页【学习目标学习目标】1.了解线性表的逻辑结构特性是数据元素之间存在着线性关系,在计算机中表示这种关系的两类不同的存储结构是顺序存储结构和链式存储结构。
用前者表示的线性表简称为顺序表,用后者表示的线性表简称为链表。
2.熟练掌握这两类存储结构的描述方法以及线性表的基本操作在这两种存储结构上的实现。
3.能够从时间和空间复杂度的角度综合比较线性表两种存储结构的不同特点及其适用场合。
4.结合线性表类型的定义增强对抽象数据类型的理解。
11/5/2022第页【重点和难点重点和难点】链表是本章的重点和难点。
扎实的指链表是本章的重点和难点。
扎实的指针操作和内存动态分配的编程技术是学针操作和内存动态分配的编程技术是学好本章的基本要求,分清链表中指针好本章的基本要求,分清链表中指针pp和结点和结点*pp之间的对应关系,区分链表之间的对应关系,区分链表中的头结点、头指针和首元结点的不同中的头结点、头指针和首元结点的不同所指以及循环链表、双向链表的特点等。
所指以及循环链表、双向链表的特点等。
【知识点知识点】线性表、顺序表、链表、有序表线性表、顺序表、链表、有序表.11/5/2022第页【学习指南学习指南】正如课程概况中所提,学习数据结构的目标是为了编出质量更高的程序,因此重在“实践”。
本章讨论的线性表是学习的第一种也是最简单的一种数据结构,是整个课程的基础,特别是熟练掌握链表的操作对以后各章的学习将有很大帮助。
本章要求必须完成的算法设计题为:
2.11,2.19,2.21,2.22,2.24,2.27,2.28,2.37,2.38。
其中2.19,2.21和2.37要求书面作业完成。
11/5/2022第页线性结构的线性结构的基本特征基本特征为为:
1集合中必存在唯一的一个集合中必存在唯一的一个“第一元素第一元素”;2集合中必存在唯一的一个集合中必存在唯一的一个“最后元素最后元素”;3除最后元素在外,均有除最后元素在外,均有唯一的后继唯一的后继;4除第一元素之外,均有除第一元素之外,均有唯一的前驱唯一的前驱。
线性结构线性结构是是一个数据元素的一个数据元素的有序(次序)集有序(次序)集线性表线性表是一种最简单的线性结构线性结构11/5/2022第页2.1线性表的类型定义线性表的类型定义2.3线性表类型的实现线性表类型的实现链式映象链式映象2.4一元多项式的表示一元多项式的表示2.2线性表类型的实现线性表类型的实现顺序映象顺序映象11/5/2022第页2.1线性表的类型定义线性表的类型定义11/5/2022第页抽象数据类型线性表线性表的定义如下:
ADTList数据对象数据对象:
Dai|aiElemSet,i=1,2,.,n,n0称n为线性表的表长表长;称n=0时的线性表为空表空表。
数据关系数据关系:
R1|ai-1,aiD,i=2,.,n设线性表为(a1,a2,.,ai,.,an),称i为ai在线性表中的位序位序。
11/5/2022第页基本操作:
基本操作:
结构初始化操作结构初始化操作结构销毁操作结构销毁操作引用型操作引用型操作加工型操作加工型操作ADTList11/5/2022第页InitList(&L)操作结果:
操作结果:
构造一个空的线性表L。
初始化操作初始化操作11/5/2022第页结构销毁操作结构销毁操作DestroyList(&L)初始条件:
操作结果:
线性表L已存在。
销毁线性表L。
11/5/2022第页ListEmpty(L)ListLength(L)PriorElem(L,cur_e,&pre_e)NextElem(L,cur_e,&next_e)GetElem(L,i,&e)LocateElem(L,e,compare()ListTraverse(L,visit()引用型操作引用型操作:
11/5/2022第页ListEmpty(L)初始条件:
操作结果:
线性表L已存在。
若L为空表,则返回TRUE,否则FALSE。
(线性表判空)11/5/2022第页ListLength(L)初始条件:
操作结果:
线性表L已存在。
返回L中元素个数。
(求线性表的长度)11/5/2022第页PriorElem(L,cur_e,&pre_e)初始条件:
操作结果:
线性表L已存在。
若cur_e是L的元素,但不是第一个,则用pre_e返回它的前驱,否则操作失败,pre_e无定义。
(求数据元素的前驱)11/5/2022第页NextElem(L,cur_e,&next_e)初始条件:
操作结果:
线性表L已存在。
若cur_e是L的元素,但不是最后一个,则用next_e返回它的后继,否则操作失败,next_e无定义。
(求数据元素的后继)11/5/2022第页GetElem(L,i,&e)初始条件:
操作结果:
线性表L已存在,且1iLengthList(L)。
用e返回L中第i个元素的值。
(求线性表中某个数据元素)11/5/2022第页LocateElem(L,e,compare()初始条件:
操作结果:
线性表L已存在,e为给定值,compare()是元素判定函数。
返回L中第中第1个个与e满足满足关系compare()的元素的位序。
若这样的元素不存在,则返回值为0。
(定位函数)11/5/2022第页ListTraverse(L,visit()初始条件:
操作结果:
线性表L已存在,Visit()为某个访问函数。
依次依次对L的每个元素调用函数visit()。
一旦visit()失败,则操作失败。
(遍历线性表)11/5/2022第页加工型操作加工型操作ClearList(&L)PutElem(&L,i,&e)ListInsert(&L,i,e)ListDelete(&L,i,&e)11/5/2022第页ClearList(&L)初始条件:
操作结果:
线性表L已存在。
将L重置为空表。
(线性表置空)11/5/2022第页PutElem(&L,i,&e)初始条件:
操作结果:
线性表L已存在,且1iLengthList(L)。
L中第i个元素赋值同e的值。
(改变数据元素的值)11/5/2022第页ListInsert(&L,i,e)初始条件:
操作结果:
线性表L已存在,且1iLengthList(L)+1。
在L的第i个元素之前插入插入新的元素e,L的长度增1。
(插入数据元素)11/5/2022第页ListDelete(&L,i,&e)初始条件:
操作结果:
线性表L已存在且非空,1iLengthList(L)。
删除L的第i个元素,并用e返回其值,L的长度减1。
(删除数据元素)11/5/2022第页利用上述定义的线性表线性表可以实现其它更复杂的操作例例2-2例例2-111/5/2022第页假设:
有两个集合集合A和和B分别用两个线性表线性表LA和和LB表示,即:
线性表中的数据元素即为集合中的成员。
现要求一个新的集合现要求一个新的集合AAB。
例例2-111/5/2022第页要求对线性表作如下操作:
扩大线性表LA,将存在于线性表存在于线性表LB中中而不存在于线性表不存在于线性表LA中中的数据元素插入到线性表插入到线性表LA中中去。
上述问题可演绎为:
11/5/2022第页1从线性表LB中依次察看每个数据元素;2依值在线性表LA中进行查访;3若不存在,则插入之。
GetElem(LB,i)eLocateElem(LA,e,equal()ListInsert(LA,n+1,e)操作步骤:
操作步骤:
11/5/2022第页GetElem(Lb,i,e);/取取Lb中第中第i个数据元素赋给个数据元素赋给eif(!
LocateElem(La,e,equal()ListInsert(La,+La_len,e);/La中不存在和中不存在和e相同的数据元素,则插入之相同的数据元素,则插入之voidunion(List&La,ListLb)La_len=ListLength(La);/求线性表的长度求线性表的长度Lb_len=ListLength(Lb);for(i=1;i=Lb_len;i+)/union11/5/2022第页已知已知一个非纯集合非纯集合B,试构造构造一个纯集合纯集合A,使使A中只包含中只包含B中所有值各中所有值各不相不相同的数据元素同的数据元素。
仍选用线性表线性表表示集合。
例例2-211/5/2022第页集合集合B集合集合A从集合B取出物件放入集合A要求集合A中同样物件不能有两件以上同样物件不能有两件以上因此,算法的策略应该和例算法的策略应该和例2-1相同相同11/5/2022第页voidunion(List&La,ListLb)La_len=ListLength(La);Lb_len=ListLength(Lb);/unionGetElem(Lb,i,e);/取取Lb中第中第i个数据元素赋给个数据元素赋给eif(!
LocateElem(La,e,equal()ListInsert(La,+La_len,e);/La中不存在和中不存在和e相同的数据元素,则插入之相同的数据元素,则插入之for(i=1;i=Lb_len;i+)InitList(La);/构造(空的)线性表LA11/5/2022第页若线性表中的数据元素相互之间可以比比较较,并且数据元素在线性表中依值非递依值非递减或非递增有序减或非递增有序排列,即aiai-1或aiai-1(i=2,3,n),则称该线性表为有序表有序表(OrderedList)(OrderedList)。
我们再来看看有序表有序表表示的集合。
11/5/2022第页例如例如:
LA=(3,5,8,11)LB=(2,6,8,9,11,15,20)对集合LA和LB而言,值相同的数据元素必定相邻。
值相同的数据元素必定相邻。
要求生成一个新表LC,使LC中的数据元素仍按值非递减有有序排列。
11/5/2022第页voidMergeList(ListLa,ListLb,List&Lc)/本算法将非递减的有序表La和Lb归并为Lc/merge_listwhile(i=La_len)&(j=Lb_len)/La和和Lb均不空均不空while(i=La_len)/若La不空while(j=Lb_len)/若Lb不空InitList(Lc);/构造空的线性表Lci=j=1;k=0;La_len=ListLength(La);Lb_len=ListLength(Lb);例例2-311/5/2022第页while(i=La_len)/当La不空时GetElem(La,i+,ai);ListInsert(Lc,+k,ai);/插入插入La表中剩余元素表中剩余元素while(j=Lb_len)/当Lb不空时GetElem(Lb,j+,bj);ListInsert(Lc,+k,bj);/插入插入Lb表中剩余元素表中剩余元素While(i=La_len)&(j=Lb_len)/当La,Lb都不空时GetElem(La,i,ai);GetElem(Lb,j,bj);if(ai=bj)ListInsert(Lc,+k,ai);+i;elseListInsert(Lc,+k,bj);+j11/5/2022第页11/5/2022第页最简单的一种顺序映象方法是:
最简单的一种顺序映象方法是:
令令yy的存储位置和的存储位置和xx的存储位置的存储位置相邻相邻。
顺序映象顺序映象以以x的存储位置和的存储位置和y的存储位置的存储位