数据结构C语言 线性表.pptx
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_05.gif)
《数据结构C语言 线性表.pptx》由会员分享,可在线阅读,更多相关《数据结构C语言 线性表.pptx(123页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、 2.1 2.1 2.1 2.1 线性表的类型定义线性表的类型定义线性表的类型定义线性表的类型定义 2.2 2.2 2.2 2.2 线性表的顺序表示和实现线性表的顺序表示和实现线性表的顺序表示和实现线性表的顺序表示和实现 2.3 2.3 2.3 2.3 线性表的链式表示和实现线性表的链式表示和实现线性表的链式表示和实现线性表的链式表示和实现 2.4 2.4 2.4 2.4 线性表的应用线性表的应用线性表的应用线性表的应用第1页/共123页2.1 线性表的类型定义线性结构的线性结构的基本特征基本特征:集合中必存在唯一的一个集合中必存在唯一的一个“第一元素第一元素”;集合中必存在唯一的一个集合中必
2、存在唯一的一个“最后元素最后元素”;除最后元素之外,均有唯一的除最后元素之外,均有唯一的后继后继;除第一元素之外,均有唯一的除第一元素之外,均有唯一的前驱前驱。从逻辑上:数据之间的关系可以分从逻辑上:数据之间的关系可以分从逻辑上:数据之间的关系可以分从逻辑上:数据之间的关系可以分4 4类类类类:线性结构线性结构线性结构线性结构,树型结构树型结构树型结构树型结构,图状结构图状结构图状结构图状结构,集合集合集合集合线性结构线性结构线性结构线性结构:是一个数据元素的是一个数据元素的有序(次序)有序(次序)集合。集合。仅指在数据元素之间存在一个 领先 或 落后 的次序关系,而非指数据元素 值 的大小可
3、比性。第2页/共123页 线性表最简单的一种线性结构线性表最简单的一种线性结构 一个线性表是一个线性表是n n个数据元素的有限序列个数据元素的有限序列 比如比如 A BZ A BZ 英文字母表英文字母表 比如比如001高等数学华罗庚S01002线性代数銮汝书L01003高等数学郑杭生 S01004离散数学耿素云S02线性表中每个数据元素的具体含义,各不相同,数据元素是基线性表中每个数据元素的具体含义,各不相同,数据元素是基线性表中每个数据元素的具体含义,各不相同,数据元素是基线性表中每个数据元素的具体含义,各不相同,数据元素是基本单位,一个数据元素由若干个数据项组成本单位,一个数据元素由若干个
4、数据项组成本单位,一个数据元素由若干个数据项组成本单位,一个数据元素由若干个数据项组成2.1 线性表的类型定义第3页/共123页线性表记为线性表记为(a a1 1,a ai i-1-1,a ai i,a ai i+1+1,a an n)a ai-1i-1 在在a ai i 之前之前 称称 a ai i-1-1是是 a ai i 的的 前驱前驱a ai i 在在 a ai i-1-1之后之后 称称 a ai i 是是 a ai i-1-1的的 后继后继序列中数据元素的个数序列中数据元素的个数 n n 定义为线性表的表长定义为线性表的表长 称称 i i 为为a ai i在线性表中的位序在线性表中的
5、位序 i i=2=2,,n n线性表的元素个数称为的线性表的元素个数称为的表长表长,n n0 0时称为时称为空表空表2.1 线性表的类型定义第4页/共123页线性表的抽象数据类型(ADT)(ADT)定义如下:ADTADT ListList 数据对象数据对象:D=aD=ai i|a|ai i ElemSet,i=1,2,.,n,n=0 ElemSet,i=1,2,.,n,n=0 数据关系数据关系:R1=aR1=|a|ai-1i-1,a,ai iD,i=2,.,n D,i=2,.,n /表示为相邻元素的有序对表示为相邻元素的有序对 基本操作基本操作:InitList(&L)InitList(&L)
6、操作结果:构造一个空的线性表操作结果:构造一个空的线性表L L。DestroyList(&L)DestroyList(&L)初始条件:线性表初始条件:线性表L L已存在。已存在。操作结果:销毁线性表操作结果:销毁线性表L L,将原表中各结,将原表中各结点所点所 占的内存空间释放。占的内存空间释放。任何数据结构在被使用之前都必须进行“初始化”,它类似于编程中使用的变量都必须先有定义。任何数据结构不再使用时都必须进行“结构销毁”,其实质为释放它所占有的存储空间。第5页/共123页引用型操作ListEmpty(L)ListEmpty(L)初始条件:线性表初始条件:线性表初始条件:线性表初始条件:线性
7、表L L已存在。已存在。已存在。已存在。操作结果:若操作结果:若操作结果:若操作结果:若L L为空表,则返回为空表,则返回为空表,则返回为空表,则返回TRUETRUE,否则,否则,否则,否则FALSEFALSE。ListLength(L)ListLength(L)初始条件:线性表初始条件:线性表初始条件:线性表初始条件:线性表L L已存在。已存在。已存在。已存在。操作结果:返回操作结果:返回操作结果:返回操作结果:返回L L中元素个数中元素个数中元素个数中元素个数。PriorElem(L,cur_e,&pre_e)PriorElem(L,cur_e,&pre_e)初始条件:线性表初始条件:线性
8、表初始条件:线性表初始条件:线性表L L已存在。已存在。已存在。已存在。操作结果:若操作结果:若操作结果:若操作结果:若cur_ecur_e是是是是L L的元素,但不是第一个,则用的元素,但不是第一个,则用的元素,但不是第一个,则用的元素,但不是第一个,则用pre_epre_e返回它的前驱,否则操作失败,返回它的前驱,否则操作失败,返回它的前驱,否则操作失败,返回它的前驱,否则操作失败,pre_epre_e无定义。无定义。无定义。无定义。NextElem(L,cur_e,&next_e)NextElem(L,cur_e,&next_e)初始条件:线性表初始条件:线性表初始条件:线性表初始条件:
9、线性表L L已存在。已存在。已存在。已存在。操作结果:若操作结果:若操作结果:若操作结果:若cur_ecur_e是是是是L L的元素,但不是最后一个,则用的元素,但不是最后一个,则用的元素,但不是最后一个,则用的元素,但不是最后一个,则用next_enext_e返回它的后继,否则操作失败,返回它的后继,否则操作失败,返回它的后继,否则操作失败,返回它的后继,否则操作失败,next_enext_e无定义无定义无定义无定义。第6页/共123页LocateElem(L,e,compare()LocateElem(L,e,compare()初始条件:线性表初始条件:线性表初始条件:线性表初始条件:线性
10、表L L已存在,已存在,已存在,已存在,compare()compare()是元素判定函数。是元素判定函数。是元素判定函数。是元素判定函数。操作结果:返回操作结果:返回操作结果:返回操作结果:返回L L中第中第中第中第1 1个与个与个与个与e e满足关系满足关系满足关系满足关系compare()compare()的元素的的元素的的元素的的元素的位序。若这样的元素不存在,则返回值为位序。若这样的元素不存在,则返回值为位序。若这样的元素不存在,则返回值为位序。若这样的元素不存在,则返回值为0 0。ListTraverse(L,visit()ListTraverse(L,visit()初始条件:线性
11、表初始条件:线性表初始条件:线性表初始条件:线性表L L已存在。已存在。已存在。已存在。操作结果:依次对操作结果:依次对操作结果:依次对操作结果:依次对L L的每个元素调用函数的每个元素调用函数的每个元素调用函数的每个元素调用函数visit()visit()。一旦。一旦。一旦。一旦visit()visit()失败,则操作失败。失败,则操作失败。失败,则操作失败。失败,则操作失败。GetElem(L,i,&e)GetElem(L,i,&e)初始条件:线性表初始条件:线性表初始条件:线性表初始条件:线性表L L已存在,已存在,已存在,已存在,1iLengthList(L)1iLengthList(
12、L)操作结果:用操作结果:用操作结果:用操作结果:用e e返回返回返回返回L L中第中第中第中第i i个元素的值。个元素的值。个元素的值。个元素的值。函数参数函数参数 compare()作为判定的条件,参数作为判定的条件,参数 e 和线性表中数据元素具有相同类型。较和线性表中数据元素具有相同类型。较多场合是以多场合是以“相等相等”作为判定条件,此时可省略函数参数,且操作结果为:若线作为判定条件,此时可省略函数参数,且操作结果为:若线性表中存在与性表中存在与 e 值相同的数据元素,则返回第一个这样的元素在表中的位序,值相同的数据元素,则返回第一个这样的元素在表中的位序,否则返回函数值为否则返回函
13、数值为0。visit()亦为函数参数,常见的情况是亦为函数参数,常见的情况是“依次输出表中元素的值依次输出表中元素的值”,同样在这种情,同样在这种情况下,通常的写法也是省略函数参数。况下,通常的写法也是省略函数参数。第7页/共123页 PutElem(&L,i,e)PutElem(&L,i,e)初始条件:线性表初始条件:线性表初始条件:线性表初始条件:线性表L L已存在,已存在,已存在,已存在,1iLengthList(L)1iLengthList(L)操作结果:操作结果:操作结果:操作结果:L L中第中第中第中第i i个元素赋个元素赋个元素赋个元素赋e e的值。的值。的值。的值。ListDe
14、lete(&L,i,&e)ListDelete(&L,i,&e)初始条件:线性表初始条件:线性表初始条件:线性表初始条件:线性表L L已存在且非空,已存在且非空,已存在且非空,已存在且非空,1iLengthList(L)1iLengthList(L)操作结果:删除操作结果:删除操作结果:删除操作结果:删除L L的第的第的第的第i i个元素,并用个元素,并用个元素,并用个元素,并用e e返回其值,返回其值,返回其值,返回其值,L L的长度减的长度减的长度减的长度减1 1。ListInsert(&L,i,e)ListInsert(&L,i,e)初始条件:线性表初始条件:线性表初始条件:线性表初始条
15、件:线性表L L已存在,已存在,已存在,已存在,1iLengthList(L)+11iLengthList(L)+1操作结果:在操作结果:在操作结果:在操作结果:在L L的第的第的第的第i i个元素之前插入新的元素个元素之前插入新的元素个元素之前插入新的元素个元素之前插入新的元素e e,L L的长度增的长度增的长度增的长度增1 1。ADT List ADT ListClearList(&L)ClearList(&L)初始条件:线性表初始条件:线性表初始条件:线性表初始条件:线性表L L已存在。已存在。已存在。已存在。操作结果:将操作结果:将操作结果:将操作结果:将L L重置为空表。重置为空表。
16、重置为空表。重置为空表。加工型操作第8页/共123页 算法2.1利用两个线性表LA和LB分别表示两个集合A和B,现要求一个新的集合A=AB。从集合的观点看,此问题求解的方法很简单,只要对集合 B 中的所有元素一个一个地检查,看看在集合 A 中是否存在相同元素,若不存在,则将该元素插入到集合 A,否则舍弃之。要在计算机中求解,首先要确定“如何表示集合”。集合可以有多种表示方法,对上述集合求并的问题可以用线性表表示集合。现假设以线性表 LA 和 LB 分别表示集合 A 和 B,即构造两个线性表 LA 和 LB,它们的数据元素分别为集合 A 和 B 中的成员。由此,上述集合求并的问题便可演绎为:要求
17、对线性表作如下操作:扩大线性表 LA,将存在于线性表 LB 中而不存在于线性表 LA 中的数据元素插入到线性表 LA 中去。第9页/共123页具体操作步骤为:1从线性表 LB 中取出一个数据元素;2依值在线性表 LA 中进行查询;3若不存在,则将它插入到 LA 中。重复上述三步直至 LB 为空表止。那么,其中的每一步能否利用上述线性表类型中定义的基本操作来完成呢?容易看出,上述的每一步恰好对应线性表的一个基本操作:1.ListDelete(LB,1,e);2.LocateElem(LA,e,equal();3.ListInsert(LA,n+1,e)第10页/共123页void union(L
18、ist&La,List&Lb)while(!ListEmpty(Lb)ListDelete(Lb,1,e);if(!LocateElem(La,e,equal()ListInsert(La,1,e);DestroyList(Lb);/union时间复杂度O(ListLength(La)ListLength(Lb)第11页/共123页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(
19、)ListInsert(la,+la_en,e);/union时间复杂度O(ListLength(La)ListLength(Lb)第12页/共123页 算法2.2巳知线性表LA和线性表LB中的数据元素按值非递减有序排列,现要求将LA和LB归并为一个新的线性表LC,且LC中的元素仍按值非递减有序排列。此问题的算法如下:第13页/共123页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-le
20、n)GetElem(la,i,ai);GetElem(lb,j,bj);if(ai=bj)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);时间复杂度O(ListLength(La)+ListLength(Lb)第14页/共123页思考1已知一个“非纯集合”B,试构造一个集合 A,使 A 中只包含 B 中所有值各不相同的数据元
21、素。分析:将每个从 B 中取出的元素和已经加入到集合 A 中的元素相比较。void purge(List&LA,List LB)/构造线性表LA,使其只包含LB中所有值不相同的数据元素,算法不改变线性表LBInitList(LA);/创建一个空的线性表 LALa_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()ListInse
22、rt(LA,+La_len,e);/for/purge第15页/共123页思考2判别两个集合是否相等。分析:首先判别两者的表长是否相等;在表长相等的前提下,对于一个表中的所有元素,是否都能在另一个表中找到和它相等的元素.第16页/共123页bool isEqual(List LA,List LB)/若线性表 LA 和 LB 不仅长度相等,且所含数据元素也相同,/则返回 TRUE,否则返回 FALSE。La_len=Listlength(LA);Lb_len=Listlength(LB);/如果集合中的元素不能保证都相异,那么这个问题的算法应如何写?if(La_len!=Lb_len)retur
23、n FALSE;/两表的长度不等 i=1;while(i=La_len)GetElem(LA,i,e);/取得 LA 中一个元素 if(LocateElem(LB,e,equal()i+;/依次处理下一个 else return FALSE;/LB中没有和该元素相同的元素 /whilereturn true;/isEqual 第17页/共123页J这个算法是否在任何情况下都正确,会不会有例外的情况?当然,这个算法思想还有一个前提是,已知集合符合集合论中的约定集合中的元素都是彼此相异的。J如果“集合”中的元素不能保证都相异,那么这个问题的算法应如何写?除了判别每个 LA 中的元素在 LB 中都存
24、在之外,还应反过来判别 LB 中每个元素都能在 LA 中找到相同者。第18页/共123页若要在实际的程序设计中真正引用线性表的基本操作,首先必须实现线性表类型。即在计算机中确定它的存储结构并在此存储结构上实现类型中定义的所有基本操作。本节将讨论它的顺序存储结构以及在顺序存储结构中基本操作的实现。第19页/共123页 2.1 2.1 2.1 2.1 线性表的类型定义线性表的类型定义线性表的类型定义线性表的类型定义 2.2 2.2 2.2 2.2 线性表的顺序表示和实现线性表的顺序表示和实现线性表的顺序表示和实现线性表的顺序表示和实现 2.3 2.3 2.3 2.3 线性表的链式表示和实现线性表的
25、链式表示和实现线性表的链式表示和实现线性表的链式表示和实现 2.4 2.4 2.4 2.4 线性表的应用线性表的应用线性表的应用线性表的应用第20页/共123页2.2 线性表的顺序表示和实现 线性表的起始地址,称作线性表线性表的起始地址,称作线性表的的基地址基地址 特点特点:用一组:用一组 地址连续地址连续 的存储单的存储单元依次存放线性表中的数据元素元依次存放线性表中的数据元素用一组地址连续的存储单元依次存放线性表中的数据用一组地址连续的存储单元依次存放线性表中的数据元素元素 顺序表顺序表顺序表顺序表线性表:(线性表:(3,9,6,8,1,73,9,6,8,1,7)顺序存储顺序存储顺序存储顺
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构C语言 线性表 数据结构 语言 线性
![提示](https://www.taowenge.com/images/bang_tan.gif)
限制150内