数据结构第二章 线性表.ppt
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《数据结构第二章 线性表.ppt》由用户(saw518)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构第二章 线性表 数据结构 第二 线性
- 资源描述:
-
1、第二章第二章 线性表线性表20232023年年5 5月月5 5日星期五日星期五 线性结构的线性结构的基本特征基本特征为为:1 1集合中必存在唯一的一个集合中必存在唯一的一个“第一元素第一元素”;2 2集合中必存在唯一的一个集合中必存在唯一的一个 “最后元素最后元素”;3 3除最后元素在外,均有除最后元素在外,均有 唯一的后继唯一的后继;4 4除第一元素之外,均有除第一元素之外,均有 唯一的前驱唯一的前驱。线性结构线性结构 是一个数据元素的是一个数据元素的有序(次序)集合。有序(次序)集合。线性表线性表是一种最简单的线性结构线性结构2.1 2.1 线性表的类型定义线性表的类型定义2.3 2.3
2、线性表类型的链式表示和实现线性表类型的链式表示和实现2.4 2.4 一元多项式的表示及相加一元多项式的表示及相加2.2 2.2 线性表类型的线性表类型的顺序表示和顺序表示和实现实现本章主要内容:本章主要内容:二、线性表的抽象数据类型表示二、线性表的抽象数据类型表示(教材教材P P1919)ADT List ADT List数据对象:数据对象:数据关系:数据关系:基本操作:基本操作:D=ai|aiElemSet,i=1,2,n,n0R=|ai 1,ai D,i=2,nInitList(&L);/建建空表,初始化空表,初始化DestoryList(&L);/撤销表,释放内存撤销表,释放内存int
3、LengthList(L);/求表中元素个数,即表长求表中元素个数,即表长PriorElem(L,cur_e,&pre_e);/求求当前元素当前元素cur_e的前驱的前驱NextElem(L,cur_e,&next_e);/求当前求当前元素元素cur_e的后继的后继ListInsertBefore(&L,i,e);/在在第第i个元素之前插入新的元素个元素之前插入新的元素eListDelete(&L,i,&e);/删除第删除第i个元素并返回此元素个元素并返回此元素2.1 2.1 线性表的类型定义线性表的类型定义抽象数据类型线性表线性表的定义细解:ADT List 数据对象数据对象:D ai|ai
4、 ElemSet,i=1,2,.,n,n0 称 n n 为线性表的表长表长;n=0n=0 时的线性表为空表空表。数据关系数据关系:R1|ai-1,aiD,i=2,.,n 2.1 线性表的类型定义线性表的类型定义 简言之,一个线性表是n个数据元素(a1,a2,,ai,an)的有限序列。称 i 为 ai 在线性表中的位序位序。基本操作:基本操作:结构初始化操作结构初始化操作结构销毁操作结构销毁操作 引用型操作引用型操作 加工型操作加工型操作 ADT ADT List InitListInitList(&L)(&L)操作结果:操作结果:构造一个空的线性表L。初始化操作初始化操作结构销毁操作结构销毁操
5、作DestroyListDestroyList(&L)(&L)初始条件:初始条件:操作结果:操作结果:线性表 L 已存在。销毁线性表 L。ListEmptyListEmpty(L)(L)ListLengthListLength(L)(L)PriorElemPriorElem(L,cur_e,&pre_e)(L,cur_e,&pre_e)NextElemNextElem(L,cur_e,&next_e)(L,cur_e,&next_e)GetElemGetElem(L,i,&e)(L,i,&e)LocateElemLocateElem(L,e,compare()(L,e,compare()Lis
6、tTraverse(LListTraverse(L,visit(),visit()引用型操作引用型操作:ListEmptyListEmpty(L)(L)(线性表判空)初始条件:操作结果:线性表L L已存在。若L L为空表,则返回TRUE,否则FALSE。ListLengthListLength(L)(L)(求线性表的长度)初始条件:操作结果:线性表L L已存在。返回L L中元素个数。PriorElemPriorElem(L,cur_e,&pre_e)(L,cur_e,&pre_e)(求数据元素的前驱)初始条件:操作结果:线性表L已存在。若cur_e是L的元素,但不是第一个,则用pre_e 返回
7、它的前驱,否则操作失败,pre_e无定义。NextElemNextElem(L,cur_e,&next_e)(L,cur_e,&next_e)(求数据元素的后继)初始条件:操作结果:线性表L已存在。若cur_e是L的元素,但不是最后一个,则用next_e返回它的后继,否则操作失败,next_e无定义。GetElemGetElem(L,i,&e)(L,i,&e)(求线性表中某个数据元素)初始条件:操作结果:线性表L L已存在,且 1iLengthList(L)1iLengthList(L)。用 e 返回L L中第 i 个元素的值。LocateElemLocateElem(L,e,compare(
8、)(L,e,compare()初始条件:操作结果:线性表L L已存在,e为给定值,compare()是元素判定函数。返回L L中第中第1 1个个与e满足满足关系compare()的元素的位序。若这样的元素不存在,则返回值为0。(定位函数)ListTraverse(LListTraverse(L,visit(),visit()初始条件:操作结果:线性表L L已存在,Visit()为某个访问函数。依次依次对L L的每个元素调用函数visit()。一旦visit()失败,则操作失败。(遍历线性表)加工型操作加工型操作 ClearListClearList(&L)(&L)PutElemPutElem(
9、&L,i,&e)(&L,i,&e)ListInsertListInsert(&L,i,e)(&L,i,e)ListDelete(&LListDelete(&L,i,&e),i,&e)ClearListClearList(&L)(&L)初始条件:操作结果:线性表L L已存在。将L L重置为空表。(线性表置空)PutElemPutElem(&L,i,&e)(&L,i,&e)初始条件:操作结果:线性表L L已存在,且 1iLengthList(L)1iLengthList(L)。L中第i个元素赋值同e的值。(改变数据元素的值)ListInsertListInsert(&L,i,e)(&L,i,e)初
10、始条件:操作结果:线性表L L已存在,且 1iLengthList(L)+1 1iLengthList(L)+1。在L L的第i i个元素之前插入插入新的元素e,L的长度增1。(插入数据元素)ListDelete(&LListDelete(&L,i,&e),i,&e)初始条件:操作结果:线性表L已存在且非空,1iLengthList(L)1iLengthList(L)。删除L的第i个元素,并用e返回其值,L的长度减1。(删除数据元素)例例 2-1:2-1:假设假设:有两个集合有两个集合 A A 和和 B B 分别用两个线性分别用两个线性表表 LA LA 和和 LB LB 表示,即:线性表中的数
11、据元素即为表示,即:线性表中的数据元素即为集合中的成员。集合中的成员。现要求一个新的集合现要求一个新的集合A AABAB。要求对线性表作如下操作:扩大线性表 LA,将存在于线性表存在于线性表LB LB 中中而不存在于线性表不存在于线性表 LA LA 中中的数据元素插入到线性表插入到线性表 LALA 中中去。上述问题可演绎为:1 1从线性表LB中依次察看每个数据元素;2 2依值在线性表LA中进行查访;3 3若不存在,则插入之。GetElem(LBGetElem(LB,i)e,i)e LocateElem(LALocateElem(LA,e,equal(),e,equal()ListInsert(
12、LAListInsert(LA,n+1,e),n+1,e)操作步骤:操作步骤:GetElem(Lb,i,e);/取取LbLb中第中第i i个数据元素个数据元素赋给赋给e e if if(!LocateElem(La,e,equal()ListInsert(La,+La_len,e);/LaLa中不存在和中不存在和 e e 相同的数据元素,则插入相同的数据元素,则插入之之voidvoid union(List&La,List Lb)La_len=ListLength(La);/求线性表的长度求线性表的长度 Lb_len=ListLength(Lb);forfor(i=1;i=Lb_len;i+)
13、/union算法:算法:2.12.1例例 2-22-2:已知一个非纯集合已知一个非纯集合 B B,试构造一个纯集合,试构造一个纯集合 A A,使使 A A中只包含中只包含 B B 中所有值各不相同的数据元素。中所有值各不相同的数据元素。集合集合 B B集合集合 A A 从集合从集合 B B 取出物件放入集合取出物件放入集合 A A,要求集合,要求集合A A中中同同样物件不能有两件以上样物件不能有两件以上因此,因此,算法的策略应该和例算法的策略应该和例2-12-1相同相同void union(List&La,List Lb)void union(List&La,List Lb)La_len La
14、_len=ListLength(LaListLength(La);Lb_len;Lb_len=ListLength(LbListLength(Lb);/union/union GetElem(Lb,i,e);/取取Lb中第中第 i 个数据元素赋给个数据元素赋给 e if(!LocateElem(La,e,equal()ListInsert(La,+La_len,e);/La中不存在和中不存在和 e 相同的数据元素,则插入之相同的数据元素,则插入之forfor(i=1;i=Lb_len;i+)InitList(LaInitList(La););/构造(空的)线性表LA 若线性表中的数据元素相互之
15、间可以比较比较,并且数据元素在线性表中依值非递减或非递增有序依值非递减或非递增有序排列,即 aiai-1 或 aiai-1(i=2,3,n),则称该线性表为有序表有序表(Ordered List)(Ordered List)。试改变结构,以有序表有序表表示集合。例例2-32-3:已知线性表已知线性表LA LA 和和LBLB中数据元素按值非递减有中数据元素按值非递减有序排列,现要求将序排列,现要求将LA LA 和和LBLB归并为一个新的线性表归并为一个新的线性表LCLC,且且LCLC中的数据元素仍按值非递减有序排列。中的数据元素仍按值非递减有序排列。例如:例如:LA=LA=(3 3,5 5,8
16、8,1111),),LB=LB=(2 2,6 6,8 8,9 9,1111,1515,2020),则),则 LC=LC=(2 2,3 3,5 5,6 6,8 8,8 8,9 9,1111,1111,1515,2020)对集合对集合 B B 而言,值相同的数据元素必定相邻;而言,值相同的数据元素必定相邻;对集合对集合 A A 而言,数据元素依值从小至大的顺序插入。而言,数据元素依值从小至大的顺序插入。因此,数据结构改变了,解决问题的策略也相应数据结构改变了,解决问题的策略也相应要改变。要改变。voidvoid MergeList(List La,List Lb,List&Lc)/已知线性表已知线
17、性表La La 和和LbLb中数据元素按值非递减有序排列,归并中数据元素按值非递减有序排列,归并La La 和和LbLb得到新的线性表得到新的线性表LcLc,LcLc中的数据元素也按值非递减排列。中的数据元素也按值非递减排列。whilewhile(i=La_len)&(j=Lb_len)InitList(LcInitList(Lc);/);/构造空的线性表构造空的线性表 LcLci=j=1;k=0;i=j=1;k=0;La_len=ListLength(LaLa_len=ListLength(La););Lb_len=ListLength(LbLb_len=ListLength(Lb););/
18、La 和 Lb 均非空,i=j=1,k=0 GetElem(La,i,ai);GetElem(Lb,j,bj);if(ai=bj)/将 ai 插入到 Lc 中 ListInsert(Lc,+k,ai);+i;else /将 bj 插入到 Lc 中 ListInsert(Lc,+k,bj);+j;/接下页接下页/whilewhile(i=La_len)/当La不空时 GetElem(La,i+,ai);ListInsert(Lc,+k,ai);/插入插入 La La 表中剩余元素表中剩余元素 whilewhile(j=Lb_len)/当Lb不空时 GetElem(Lb,j+,bj);ListIn
19、sert(Lc,+k,bj);/插入插入 Lb Lb 表中剩余元素表中剩余元素 /merge_list算法:算法:2.22.2一、顺序表的表示一、顺序表的表示顺序存储定义:顺序存储定义:把逻辑上相邻的元素存储在物理把逻辑上相邻的元素存储在物理 位置上相邻的存储单元中。位置上相邻的存储单元中。采用顺序存储结构存储的线性表采用顺序存储结构存储的线性表简言之:简言之:逻辑相邻,物理也相邻逻辑相邻,物理也相邻顺序存储方法:顺序存储方法:用一组用一组地址连续地址连续的存储单元依次的存储单元依次 存放线性表的数据元素。存放线性表的数据元素。2.2 线性表的顺序表示和实现已知:已知:L=(a1,a2,ai-
20、1,ai,ai+1,an)bb+1b+2b+(maxlen-1)a1a2ai-1aiai+1anb+(i-1)占占k个存储单元个存储单元b+(i-1)*kLoc(ai+1)Loc(ai)存储单元的个数存储单元的个数+k=Loc(ai)loc(a1)=+(i-1)*k Loc(a1)表示线性表第表示线性表第1个元素个元素a1的存储位置,即基地址的存储位置,即基地址 若每个元素占用若每个元素占用k个存储单元个存储单元2.2 线性表的顺序表示和实现基地址基地址基地址基地址线性表顺序存储结构的特点线性表顺序存储结构的特点1、逻辑上相邻的物理元素,其物理位置上也相邻 2、若已知线性表中第1个元素的存储位
21、置,则线性表中任意 一个元素的位置都可由公式计算得出。即,线性表的顺序存储结构是一种随机存取的存储结构。例:例:一个一维数组一个一维数组M,下标范围是,下标范围是0到到9,每个数组元素用,每个数组元素用相邻的相邻的5个字节存储。存储器按字节编址,设存储数组元素个字节存储。存储器按字节编址,设存储数组元素M0的第一个字节的地址是的第一个字节的地址是98,则,则M3的第一个字节的地的第一个字节的地址是址是 。1132.2 线性表的顺序表示和实现先为顺序表空间设定一个初始分配量,一旦因插入元素而空先为顺序表空间设定一个初始分配量,一旦因插入元素而空间不足时,可为顺序表增加一个固定长度的空间增量。间不
22、足时,可为顺序表增加一个固定长度的空间增量。线性表的动态分配顺序存储结构线性表的动态分配顺序存储结构#define LIST_INIT_SIZE 100/存储空间的初始分配量存储空间的初始分配量#define LISTINCREMENT 10/存储空间的分配增量存储空间的分配增量Typedef struct ElemType*elem;/表基址表基址(用指针用指针*elemelem表示表示)int length;/表长度(表长度(表中有多少个元素表中有多少个元素)int listsize;/当前分配的表尺寸(当前分配的表尺寸(字节单位字节单位)SqList;存储结构描述如下存储结构描述如下(见
23、教材(见教材P22P22):2.2 线性表的顺序表示和实现sizeof(x)的意思是:的意思是:计算变量计算变量x的长度的长度(字节数字节数)malloc(m)函数的意思是:新开一片函数的意思是:新开一片大小为大小为m字节的连续空间,并把该字节的连续空间,并把该区首址作为函数值。区首址作为函数值。Status InitList_Sq(SqList&L)/创建一个空线性表创建一个空线性表 L.elem=(ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType);If(!L.elem)exit(OVERFLOW);/分配失败,结束程序分配失败,结束程序 L.
24、length=0;/暂无元素放入,空表暂无元素放入,空表 L.listsize=LIST_INIT_SIZE;/表尺寸表尺寸=初始分配量初始分配量 Return OK;/InitList_Sq/InitList_Sq动态创建一个空顺序表的算法:动态创建一个空顺序表的算法:(见教材(见教材P23)2.2 线性表的顺序表示和实现线性表的基本操作在顺序表中的实现:线性表的基本操作在顺序表中的实现:InitList(&LInitList(&L)/)/结构初始化结构初始化LocateElem(LLocateElem(L,e,compare()/,e,compare()/查找查找ListInsert(&L
25、ListInsert(&L,i,e)/,i,e)/插入元素插入元素ListDelete(&LListDelete(&L,i)/,i)/删除元素删除元素StatusStatus InitList_Sq(SqList&L)/构造一个空的线性表 /InitList_Sq算法时间复杂度时间复杂度:O(1)O(1)L.elem=(ElemType*)mallocmalloc (LIST_ INIT_SIZE sizeofsizeof (ElemType);ifif(!L.elem)exitexit(OVERFLOW);/存储分配失败存储分配失败L.length=0;/空表长度为空表长度为0 0L.lis
展开阅读全文