




已阅读5页,还剩69页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
2.1线性表的类型定义2.2线性表的顺序表示和实现2.3线性表的链式表示和实现2.4一元多项式的表示,第2章线性表,重点:(1)线性表ADT顺序存储实现中的基本操作及相关算法;(2)ADT链式存储实现中基本操作及相关算法;(3)双向链表的基本操作及相关算法;(4)循环链表的特点、基本操作及相关算法。难点:线性表ATD的设计和实现,线性表ADT链式存储实现,包括双向链表、循环链表的基本操作和有关算法。,本章重点难点,2.1线性表的类型定义2.2线性表的顺序表示和实现2.3线性表的链式表示和实现2.4一元多项式的表示,第2章线性表,线性结构的基本特征为:,(1)集合中必存在唯一的一个“第一元素”;(2)集合中必存在唯一的一个“最后元素”;(3)除最后元素在外,均有唯一的后继;(4)除第一元素之外,均有唯一的前驱。,线性表是n个类型相同数据元素的有限序列,通常记作(a1,a2,a3,an)。,2.1线性表的类型定义,线性表的定义,ADTList,数据对象:,Dai|aiElemSet,i=1,2,.,n,n0称n为线性表的表长;称n=0时的线性表为空表。,数据关系:,R1|ai-1,aiD,i=2,.,n,线性结构的基本特征为:,2.1线性表的类型定义,基本操作:,ADTList,见下页,基本操作,2.1线性表的类型定义,InitList(,(2)依值在线性表LA中进行查访;,(3)若不存在,则插入之。,GetElem(LB,i,i=Lb_len;i+),例2-1算法,2.1线性表的类型定义,.,GetElem(Lb,i,e);/取Lb中第i个数据元素赋给eif(!LocateElem(La,e,equal()ListInsert(La,+La_len,e);/La中不存在和e相同的数据元素,则插入之,例2-1算法时间复杂性,O(ListLength(La)*ListLength(Lb),例2-1算法,2.1线性表的类型定义,将两个“数据元素按值递增有序排列”的线性表La和Lb归并到线性表Lc,且Lc具有同样的性质。,设La=(a1,ai,.an)Lb=(b1,bj,.bm)Lc=(c1,ck,cm+n),2.1线性表的类型定义,基本操作的应用,用定义过的基本操作实现例2-2,例2-2,voidMergeList(ListLa,ListLb,List/构造空的线性表Lci=j=1;k=0;La_len=ListLength(La);Lb_len=ListLength(Lb);,2.1线性表的类型定义,例2-2算法,见下页,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;,2.1线性表的类型定义,例2-2算法,while(inext为空。,2.3.1单链表,StatusGetElem_L(LinkListL,inti,ElemTypej=1;/p指向第一个结点,j为计数器,while(p,if(!p)returnERROR;/第i个元素不存在e=p-data;/取得第i个元素returnOK;,GetElem_L算法,2.3.1单链表,单链表操作的实现,StatusListInsert_L(LinkListL,inti,ElemTypee)/L为带头结点的单链表的头指针,本算法/在链表中第i个结点之前插入新的元素e,插入过程,(1)查找第i-1个结点p;(2)生成结点s,存入e;(3)s-netx=p-next,p-next=s;,2.3.1单链表,StatusListInsert_L(LinkListL,inti,ElemTypee)/L为带头结点的单链表的头指针,本算法/在链表中第i个结点之前插入新的元素e/LinstInsert_L,p=L;j=0;while(p/i大于表长或者小于1,ListInsert_L算法,2.3.1单链表,s=(LinkList)malloc(sizeof(LNode);/生成新结点s-data=e;s-next=p-next;p-next=s;/插入returnOK;,O(ListLength(L),ListInsert_L算法,ListInsert_L算法的时间杂性,2.3.1单链表,单链表操作的实现,ListDelete_L(LinkListL,inti,ElemTypej=0;while(p-next/删除位置不合理,q=p-next;p-next=q-next;e=q-data;free(q);returnOK;,2.3.1单链表,单链表应用举例,将两个“数据元素按值递增有序排列”的线性表La和Lb归并到线性表Lc,且Lc具有同样的性质。,设La=(a1,ai,.an)Lb=(b1,bj,.bm)Lc=(c1,ck,cm+n),例2-3,2.3.1单链表,StatusMergeList_L(LinkList/MergeList_L,例2-3算法,2.3.1单链表,(1)优点a.插入和删除时间复杂性低;b.不需预先分配空间。(2)缺点a.指针占用存储空间,增加了内存负担。,链表的优缺点,2.3.1单链表,2.3线性表的链式表示和实现,2.3.1单链表2.3.2静态链表2.3.3循环链表2.3.4双向链表,静态链表的引入,2.3.2静态链表,链表具有不需事先分配存储空间,插入和删除操作时间复杂性低等优点,但实现链表必须能够对内存地址进行操作,但直接对内存地址进行操作是很多高级语言不具备的功能,为了在不具备地址操作的高级语言上实现链表的功能,引入了静态链表。,静态链表的概念,定义一个较大的结构数组作为备用结点空间(即存储池),当申请结点时,从存储池中取出一个结点,当释放结点时,将结点归还存储池内。,静态链表示意图,2.3.2静态链表,012345678910,存储池space,data域,cur域,静态链表的第一个结点位置是一个下标:左图中有两个静态链表第一个以1开头。space1,space3,space5,space6.第二个以2开头space2,space4,space7,space8.,/-线性表的静态单链表存储结构-/#defineMAXSIZE1000/链表的最大长度typedefstructElemTypedata;intcur;/游标component,SLinkListMAXSIZE;,SLinkListspace;,2.3.2静态链表,静态链表的C语言实现,/-初始化-/voidInitSpace_SL(SLinkList,2.3.2静态链表,静态链表模拟可用空间初始化,/-申请空间-/intMalloc_SL(SLinkList,2.3.2静态链表,静态链表模拟申请空间的实现,/-回收结点-/voidFree_SL(SLinkList,2.3.2静态链表,静态链表模拟释放空间的实现,StatusListInsert_L(intL,inti,ElemTypee)/L为静态链表的第一个结点位置,本算法/在链表中第i个结点之前插入新的元素e,p=L;j=0;while(p,2.3.2静态链表,静态链表插入算法,s=Malloc_SL(space)/生成新结点spaces.data=e;spaces.cur=spacep.cur;spacep.cur=s;/插入新结点returnOK;,O(ListLength(L),静态链表插入算法,静态链表插入算法时间复杂性,2.3.2静态链表,2.3线性表的链式表示和实现,2.3.1单链表2.3.2静态链表2.3.3循环链表2.3.4双向链表,单链表最后一个结点的指针域没有利用,如果使其指向指向头指针(头结点),则首尾构成一个循环,称作循环链表。,2.3.3循环链表,循环链表的概念,循环链表示意图,head,从表中任一结点出发均可找到表中其它结点。,讨论:在循环链表中多采用尾指针?为什么?,结论:如果采用尾指针,则查找第一个结点和最后一个结点都容易。,循环链表的优点,head,2.3.3循环链表,设两个链表La=(a1,a2,.,an)和Lb=(b1,b2,.bm),讨论如下问题:,(1)La、Lb都是带头结点的单链表,如何实现将Lb接在La之后?时间复杂度是多少?(2)La、Lb都是带头结点头指针的单循环链表,如何实现将Lb接在La之后还形成一个循环链表?时间复杂度是多少?(3)La、Lb都是带头结点尾指针的单循环链表,如何实现将Lb接在La之后还形成一个循环链表?时间复杂度是多少?,单链表和循环链表操作比较,2.3.3循环链表,结论:,(1)La、Lb都是带头结点的单链表,Lb接在La之后,时间复杂度是O(length(La)。(2)La、Lb都是带头结点头指针的单循环链表,实现将Lb接在La之后还形成一个循环链表,时间复杂度是多少O(length(La)+length(Lb)。(3)La、Lb都是带头结点尾指针的单循环链表,实现将Lb接在La之后还形成一个循环链表,时间复杂度是O(1)。,单链表和循环链表操作比较,2.3.3循环链表,2.3.3双向链表,双向链表的概念,一个链表的每一个结点含有两个指针域:一个指针指向其前驱结点,另一个指针指向其后继结点,这样的链表称为双向链表。,双向链表结构示意图,head,/类型定义typedefstructDuLNodeElemTypedata;structDuLNode*prior;structDuLNode*next;DuLNode,*DuLinkList;,2.3.3双向链表,双向链表的C语言实现,在双向链表中:p-prior指向p的前驱,p-next指向p的后继以下都是p结点的地址:p-next-prior和p-prior-next,2.3.3双向链表,双向链表中地址关系,双向链表的操作特点:,“查询”和单链表相同。“插入”和“删除”时需要同时修改两个方向上的指针。,StatusListInsert_Dul(DuLinkList,2.3.3双向链表,双向链表的插入算法,StatusListDelete_Dul(DuLinkList,2.3.3双向链表,双向链表的删除算法,2.1线性表的类型定义2.2线性表的顺序表示和实现2.3线性表的链式表示和实现2.4一元多项式的表示,第2章线性表,2.4一元多项式的表示,讨论一元多项式用什么方式存储比较合适?,结论:一元多项式既可以用顺序表存储,也可以用链表存储,在用顺序表存储时,如果是稀疏多项式则浪费空间严重,用链式存储比较好。,一元多项式的讨论,ADTPolynomial数据对象:数据关系:ADTPolynomial,R1|ai-1,aiD,i=2,.,n且ai-1中的指数值ai中的指数值,Dai|aiTermSet,i=1,2,.,m,m0TermSet中的每个元素包含一个表示系数的实数和表示指数的整数,2.4一元多项式的表示,一元多项式的抽象数据类型,基本操作:,见下页,CreatPolyn(/系数int
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 中国银行2025巴音郭楞蒙古自治州秋招笔试英语题专练及答案
- 邮储银行2025来宾市半结构化面试15问及话术
- 交通银行2025娄底市秋招结构化面试经典题及参考答案
- 建设银行2025鄂尔多斯市笔试英文行测高频题含答案
- 2025年3D打印的伦理争议
- 交通银行2025荆州市秋招笔试专业知识题专练及答案
- 2025行业市场规模增长动力分析
- 农业银行2025贺州市数据分析师笔试题及答案
- 农业银行2025清远市半结构化面试15问及话术
- 邮储银行2025兰州市半结构化面试15问及话术
- 肝性脑病(课件)
- 【名校】《三思而后行》 完整版课件
- 公司内部程序文件(格式模版)
- 泛光施工招标文件
- 旅游策划实务整套课件完整版电子教案课件汇总(最新)
- DB23∕T 2661-2020 地热能供暖系统技术规程
- 人工挖孔桩施工监测监控措施
- 国家职业技能标准 (2021年版) 6-18-01-07 多工序数控机床操作调整工
- 办公楼加层改造施工组织设计(100页)
- 渗透检测培训教材(1)
- 空调专业常用英文词汇
评论
0/150
提交评论