第二章 线性表.ppt
《第二章 线性表.ppt》由会员分享,可在线阅读,更多相关《第二章 线性表.ppt(44页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第二章第二章 线性表线性表n n2.1 线性表的类型定义线性表的类型定义n n2.2 线性表的顺序表示与实现线性表的顺序表示与实现 n n2.3 线性表的链式表示与实现线性表的链式表示与实现n n2.3.1 2.3.1 线性链表线性链表n n2.3.2 2.3.2 循环链表循环链表n n2.3.3 2.3.3 双向链表双向链表第二章第二章 线性表线性表n n线性结构的特点是线性结构的特点是:n n存在唯一的存在唯一的存在唯一的存在唯一的第一个第一个第一个第一个数据元素数据元素数据元素数据元素;n n存在唯一的存在唯一的存在唯一的存在唯一的最后一个最后一个最后一个最后一个数据元素数据元素数据元素
2、数据元素;n n除第一个外除第一个外除第一个外除第一个外,每个数据元素均有且只有一个每个数据元素均有且只有一个每个数据元素均有且只有一个每个数据元素均有且只有一个前驱前驱前驱前驱元元元元素素素素;n n除最后一个外除最后一个外除最后一个外除最后一个外,每个数据元素均有且只有一个每个数据元素均有且只有一个每个数据元素均有且只有一个每个数据元素均有且只有一个后继后继后继后继元素。元素。元素。元素。2.1 2.1 线性表的类型定义线性表的类型定义n n线性表举例线性表举例:n n字母表字母表字母表字母表 (A,B,C,X,Y,Z)(A,B,C,X,Y,Z)n n数据序列数据序列数据序列数据序列 (6
3、,17,28,50,92,188)(6,17,28,50,92,188)n nn个元素的线性表个元素的线性表:n n(a1,a2,ai,ai+1,an)第一个元素第一个元素第一个元素第一个元素(没有前驱没有前驱没有前驱没有前驱)第第第第i i个元素个元素个元素个元素(有唯一的前驱有唯一的前驱有唯一的前驱有唯一的前驱和唯一的后继和唯一的后继和唯一的后继和唯一的后继)最后一个元素最后一个元素最后一个元素最后一个元素(没有后继没有后继没有后继没有后继)线性表的抽象数据类型线性表的抽象数据类型(ADT)(ADT)ADT List ADT List n n数据对象:数据对象:数据对象:数据对象:D=D=
4、a ai i|a|ai i属于属于属于属于Elemset,(iElemset,(i=1,2,n,n0)=1,2,n,n0)n n数数数数 据据据据 关关关关 系系系系:R1=R1=a ai-1i-1,a,ai i|a|ai-1i-1,a,ai i属属属属 于于于于D,(i=2,3,n)D,(i=2,3,n)n n基本操作:基本操作:基本操作:基本操作:n nInitList(&LInitList(&L););n nDestroyList(&LDestroyList(&L););n nListInsert(&L,i,eListInsert(&L,i,e););n nListDelete(&L,i
5、,&eListDelete(&L,i,&e););n n等等等等等等等等 ADT List ADT Listn nInitList(&L);DestroyList(&L);n nClearList(&L);ListEmpty(L);n nListLength(L);GetElem(L,i,&e);n nLocateElem(L,e,compare();n nPriorElem(L,cur_e,&pre_e);n nNextElem(L,cur_e,&next_e);n nListInsert(&L,i,e);ListDelete(&L,i,&e);n nListTraverse(&L,visi
6、ted()线性表线性表ADTADT的基本操作:的基本操作:n nInitList(&L)n n操作结果操作结果操作结果操作结果:构造一个空的线性表构造一个空的线性表构造一个空的线性表构造一个空的线性表L L。n nDestroyList(&L)n n初始初始初始初始条件条件条件条件:线性表线性表线性表线性表L L已经存在。已经存在。已经存在。已经存在。n n操作结果操作结果操作结果操作结果:销毁线性表销毁线性表销毁线性表销毁线性表L L。n nClearList(&L)n n初始条件初始条件初始条件初始条件:线性表线性表线性表线性表L L已经存在。已经存在。已经存在。已经存在。n n操作结果操
7、作结果操作结果操作结果:将线性表将线性表将线性表将线性表L L重置为空表。重置为空表。重置为空表。重置为空表。基本操作基本操作(一一):n nListEmpty(L)n n初始条件初始条件初始条件初始条件:线性表线性表线性表线性表L L已经存在。已经存在。已经存在。已经存在。n n操操操操作作作作结结结结果果果果:若若若若线线线线性性性性表表表表L L为为为为空空空空表表表表,则则则则返返返返回回回回TURE;TURE;否否否否则返回则返回则返回则返回FALSEFALSE。n nListLength(L)n n初始条件初始条件初始条件初始条件:线性表线性表线性表线性表L L已经存在。已经存在。
8、已经存在。已经存在。n n操作结果操作结果操作结果操作结果:返回线性表返回线性表返回线性表返回线性表L L中的数据元素个数。中的数据元素个数。中的数据元素个数。中的数据元素个数。基本操作基本操作(二二):n nGetElem(L,i,&e)n n初初初初 始始始始 条条条条 件件件件:线线线线 性性性性 表表表表 L L已已已已 经经经经 存存存存 在在在在,1=i=1=i=ListLength(LListLength(L)。n n操操操操作作作作结结结结果果果果:用用用用e e返返返返回回回回线线线线性性性性表表表表L L中中中中第第第第i i个个个个数数数数据据据据元元元元素素素素的的的的
9、值。值。值。值。n nLocateElem(L,e,compare()n n初始条件初始条件初始条件初始条件:线性表线性表线性表线性表L L已经存在,已经存在,已经存在,已经存在,compare()compare()是数是数是数是数据元素判定函数据元素判定函数据元素判定函数据元素判定函数。n n操作结果操作结果操作结果操作结果:返回返回返回返回L L中第中第中第中第1 1个与个与个与个与e e满足满足满足满足compare()compare()的的的的数据元素的位序。若这样的数据元素不存在则数据元素的位序。若这样的数据元素不存在则数据元素的位序。若这样的数据元素不存在则数据元素的位序。若这样的
10、数据元素不存在则返回值为返回值为返回值为返回值为0 0。基本操作基本操作(三三):n nPriorElem(L,cur_e,&pre_e)n n初始条件初始条件初始条件初始条件:线性表线性表线性表线性表L L已经存在已经存在已经存在已经存在。n n操操操操作作作作结结结结果果果果:若若若若cur_ecur_e是是是是L L的的的的数数数数据据据据元元元元素素素素,且且且且不不不不是是是是第第第第一一一一个个个个,则则则则用用用用pre_epre_e返返返返回回回回它它它它的的的的前前前前驱驱驱驱,否否否否则则则则操操操操作作作作失失失失败败败败;pre_epre_e无无无无意义。意义。意义。意
11、义。n nNextElem(L,cur_e,&next_e)n n初始条件初始条件初始条件初始条件:线性表线性表线性表线性表L L已经存在。已经存在。已经存在。已经存在。n n操作结果操作结果操作结果操作结果:若若若若cur_ecur_e是是是是L L的数据元素的数据元素的数据元素的数据元素,且不是第最且不是第最且不是第最且不是第最后个后个后个后个,则用则用则用则用next_enext_e返回它的后继返回它的后继返回它的后继返回它的后继,否则操作失否则操作失否则操作失否则操作失 败败败败,next_enext_e无意义。无意义。无意义。无意义。基本操作基本操作(四四):n nListInser
12、t(&L,i,e)n n初始条件初始条件初始条件初始条件:线性表线性表线性表线性表L L已经存在,已经存在,已经存在,已经存在,1=i=n 1=i=n ListLength(L)+1ListLength(L)+1。n n操作结果操作结果操作结果操作结果:在在在在L L的第的第的第的第i i个位置之前插入新的数据元个位置之前插入新的数据元个位置之前插入新的数据元个位置之前插入新的数据元素素素素e,Le,L的长度加一。的长度加一。的长度加一。的长度加一。插入前插入前(长度为长度为n):(a1,a2,ai-1,ai,an)插插 入入 后后(长长 度度 为为 n+1):(a1,a2,ai-1,e,ai
13、,an)基本操作基本操作(五五):n nListDelete(&L,i,&e)n n初始条件初始条件初始条件初始条件:线性表线性表线性表线性表L L已经存在,已经存在,已经存在,已经存在,1=i=n 1=i=n ListLength(LListLength(L)。n n操作结果操作结果操作结果操作结果:删除删除删除删除L L的第的第的第的第i i个数据元素个数据元素个数据元素个数据元素,并用并用并用并用e e返回其返回其返回其返回其值值值值,L,L的长度减一。的长度减一。的长度减一。的长度减一。删除前删除前(长度为长度为n):(a1 1,a2 2,ai-1i-1,ai i,ai+1i+1,an
14、 n)删除后删除后(长度为长度为n-1):(a1 1,a2 2,ai-1i-1,ai+1i+1,an n)n nListTraverse(&L,visited()基本操作基本操作(六六):例例2-1 2-1 线性表线性表La,LbLa,Lb的合并的合并.La=LaLb.(La=LaLb.(算法算法2.1)2.1)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
15、(La,+La_len,e);/union例例2-1 2-1 线性表线性表La,LbLa,Lb的合并的合并.La=(2,5,7,9)Lb=(4,5,6,7)合并结果合并结果:La=(2,5,7,9,4,6)由本节最后知,算法由本节最后知,算法2.12.1的时间复杂度为的时间复杂度为 O(ListLength(La)ListLength(Lb);例例2-2 2-2 非非递递减减线线性性表表La,LbLa,Lb的的合合并并.Lc=LaLb.(算法算法2.2)La=(3,5,8,11)Lb=(2,6,8,9,11,15,20)合并结果合并结果:Lc=(2,3,5,6,8,8,9,11,11,15,2
16、0)void void void void MergeList(ListMergeList(ListMergeList(ListMergeList(List La,List Lb,List&La,List Lb,List&La,List Lb,List&La,List Lb,List&LcLcLcLc)/已知非递减线性表已知非递减线性表已知非递减线性表已知非递减线性表La,LbLa,LbLa,LbLa,Lb /将所有将所有将所有将所有LaLaLaLa和和和和LbLbLbLb中的数据元素归并到中的数据元素归并到中的数据元素归并到中的数据元素归并到LcLcLcLc中中中中,/使使使使LcLcLcL
17、c的数据元素也是非递减的的数据元素也是非递减的的数据元素也是非递减的的数据元素也是非递减的./MergeListMergeListMergeListMergeList 时间复杂度为时间复杂度为时间复杂度为时间复杂度为:(:(ListLength(La)+ListLength(LbListLength(La)+ListLength(Lb););非递减线性表合并的非递减线性表合并的C C程序程序 InitListInitList(&Lc(&Lc);i=j=1;k=0;);i=j=1;k=0;La_lenLa_len=ListLengthListLength(La(La););Lb_lenLb_le
18、n=ListLengthListLength(Lb(Lb););While(i=While(i=La_lenLa_len)&(j=)&(j=Lb_lenLb_len)GetElemGetElem(La,i,ai(La,i,ai););GetElemGetElem(Lb,j,bj(Lb,j,bj););if(if(aiai=bjbj)ListInsertListInsert(LcLc,+k,+k,aiai);+i;);+i;else else ListInsertListInsert(LcLc,+k,+k,bjbj);+j;);+j;while(i=while(i=La_lenLa_len)Ge
19、tElemGetElem(La,i+,ai(La,i+,ai););ListInsertListInsert(Lc(Lc,+k,+k,aiai););while(j=while(j=Lb_lenLb_len)GetElemGetElem(Lb,j+,bj(Lb,j+,bj););ListInsertListInsert(Lc,+k(Lc,+k,bjbj););n n线性表线性表(a(a1 1,a,a2 2,a,ai i,a,ai+1i+1,a,an n)的顺序表示的顺序表示:用用一一组组地地址址连连续续的的存存贮贮单单元元依依次次存存贮贮线线性性表表的的数据元素数据元素.Loc(ai+1)=L
20、oc(ai)+Loc(ai)=Loc(a1)+(i-1)*设设为每个数据元素所需的存储大小为每个数据元素所需的存储大小2.2 2.2 线线性性表表的的顺顺序序表表示示与与实实现现 (物理结构物理结构)线性表的顺序表示线性表的顺序表示(图示图示)b-b-b-b-为为为为a1a1a1a1数据元素的存储地址数据元素的存储地址数据元素的存储地址数据元素的存储地址-为为为为为每个数据元素所需的存储大小为每个数据元素所需的存储大小为每个数据元素所需的存储大小为每个数据元素所需的存储大小typedeftypedef structstruct ElemTypeElemType *elemelem;intint
21、 length;length;intint listsizelistsize;SqListSqList;Status Status InitList_Sq(SqListInitList_Sq(SqList&L)&L)L.elemL.elem=(=(ElemTypeElemType*)*)mallocmalloc(LIST_INIT_SIZE(LIST_INIT_SIZE *sizeof(ElemTypesizeof(ElemType););if(!if(!L.elemL.elem)return(OVERFLOW);)return(OVERFLOW);L.lengthL.length=0;=0;
22、L.listsizeL.listsize=LIST_INIT_SIZE;=LIST_INIT_SIZE;return OK;return OK;/算法算法算法算法2.32.32.32.3Status Status Status Status ListInsert_Sq(SqlistListInsert_Sq(SqlistListInsert_Sq(SqlistListInsert_Sq(Sqlist&L,&L,&L,&L,intintintint i,i,i,i,ElemTypeElemTypeElemTypeElemType e)e)e)e)/在顺序线性表在顺序线性表在顺序线性表在顺序线性表
23、L L L L的第的第的第的第i i i i个位置之前插入新的元素个位置之前插入新的元素个位置之前插入新的元素个位置之前插入新的元素e e e e /i /i /i /i的合法值为的合法值为的合法值为的合法值为1=i=ListLength_Sq(L)+11=i=ListLength_Sq(L)+11=i=ListLength_Sq(L)+11=i=ListLength_Sq(L)+1 ElemTypeElemTypeElemTypeElemType*q,*p,*q,*p,*q,*p,*q,*p,*newbasenewbasenewbasenewbase;if(iL.length+1)retur
24、n ERROR;if(iL.length+1)return ERROR;if(iL.length+1)return ERROR;if(iL.length+1)return ERROR;/i/i/i/i值不合法值不合法值不合法值不合法 if(if(if(if(L.lengthL.lengthL.lengthL.length=L.listsizeL.listsizeL.listsizeL.listsize)/当前存储空间已满当前存储空间已满当前存储空间已满当前存储空间已满,增加分配增加分配增加分配增加分配newbasenewbasenewbasenewbase=(=(=(=(ElemTypeEle
25、mTypeElemTypeElemType*)*)*)*)reallocreallocreallocrealloc(L.elemL.elemL.elemL.elem,(L.listsize+LISTINCREMENTL.listsize+LISTINCREMENTL.listsize+LISTINCREMENTL.listsize+LISTINCREMENT)*)*)*)*sizeof(ElemTypesizeof(ElemTypesizeof(ElemTypesizeof(ElemType););););if(!if(!newbasenewbase)exit(OVERFLOWexit(OVE
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第二章 线性表 第二 线性
限制150内