




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、1,每课一贴: 有一位表演大师上场前,他的弟子告诉他鞋带松了。大师点头致谢,蹲下来仔细系好。等到弟子转身后,又蹲下来将鞋带解松。有个旁观者看到了这一切,不解地问:“大师,您为什么又要将鞋带解松呢?”大师回答道:“因为我饰演的是一位劳累的旅者,长景涉让他的鞋事松开,可以通过这个细节表现他的劳累憔悴.”“那你为什么不直接告诉你的弟子呢?”“他能细心地发现我的鞋带松了,并且热心地告诉我,我一定要保护他这种热情的积极性,及时地给他鼓励,至于为什么要将鞋带解开,将来会有更多的机会教他表演,可以下一次再说啊。”人一个时间只能做一件事,懂抓重点,才是真正的人才.,2,上堂课要点回顾,线性结构(包括表、栈、队
2、、数组)的定义和特点: 仅一个首、尾结点,其余元素仅一个直接前驱和一个直接后继。,3,2.3 线性表的链式表示和实现,2.3.1 链表的表示 2.3.2 链表的实现 2.3.3 链表的运算效率分析,链表小结,4,2.3.1 链表的表示,链式存储结构特点:其结点在存储器中的位置是随意的,即逻辑上相邻的数据元素在物理上不一定相邻。,如何实现?,通过指针来实现,注意:每个存储结点都包含两部分: 数据域和指针域,5,与链式存储有关的术语:,1、结点:数据元素的存储映像。由数据域和指针域两部分组成; 2、链表: n 个结点由指针链组成一个链表。它是线性表的链式存储映像,称为线性表的链式存储结构。 3、单
3、链表、双链表、多链表、循环链表: 结点只有一个指针域的链表,称为单链表或线性链表; 有两个指针域的链表,称为双链表; 有多个指针域的链表,称为多链表; 首尾相接的链表称为循环链表。,循环链表示意图:,6,4、头指针、头结点和首元结点,示意图如下:,头指针,头结点,首元结点,头指针是指向链表中第一个结点(或为头结点或为首元结点)的指针; 头结点是在链表的首元结点之前附设的一个结点;数据域内只放空表标志和表长等信息; 首元结点是指链表中存储线性表第一个数据元素a1的结点。,7,一个线性表的逻辑结构为:(ZHAO,QIAN,SUN,LI,ZHOU,WU,ZHENG,WANG),其存储结构用单链表表示
4、如下,请问其头指针的值是多少?,例:,答:头指针是指向链表中第一个结点的指针,因此关键是要寻找第一个结点的地址。,31,头指针的值是31,8,上例链表的逻辑结构示意图有以下两种形式:,区别: 无头结点 有头结点,9,答:,讨论1. 在链表中设置头结点有什么好处?,讨论2. 如何表示空表?,头结点即在链表的首元结点之前附设的一个结点,该结点的数据域中不存储线性表的数据元素,其作用是为了对链表进行操作时,可以对空表、非空表的情况以及对首元结点进行统一处理,编程更方便。,答:,无头结点时,当头指针的值为空时表示空表; 有头结点时,当头结点的指针域为空时表示空表。,10,讨论2. 头结点的数据域内装的
5、是什么?,头结点的数据域可以为空,也可存放线性表长度等附加信息,但此结点不能计入链表长度值。,答:,讨论3. 链表的数据元素有两个域,不再是简单数据类型,编程时该如何表示?,因每个结点至少有两个分量,所以要采用结构数据类型。,答:,什么是结构类型?如何书写表达?,头结点的数据域,11,实现,结点接口 Public interface Node public Object getData( ); /获取结点数据域 Public void setData(Object object); /设置结点数据域 ,3. 线性链表的实现 定义:结点中只含一个指针域的链表叫,也叫单链表,Public clas
6、s SLNode implements Node private Object element; private SLNode next; public SLNode this(null,null); public SLNode(Object ele, SLnode next) this.element=ele; this.next=next; public SLNode getNext( ) return next; public void setNext(SLNode next) this.next =next; public Object getData( ) return elemen
7、t; public void setData(Object obj) element=obj; ,12,用一组任意的存储单元存储线性表的数据元素 利用指针实现了用不相邻的存储单元存放逻辑上相邻的元素 每个数据元素ai,除存储本身信息外,还需存储其直接后继的地址 结点 数据域:元素本身信息 指针域:指示直接后继的存储位置,简单总结:线性表的链式表示的基本特征:,13,4. 单链表的基本运算,算法评价,查找:查找单链表中是否存在结点X,查找、插入、删除、创建、原地逆序,算法描述,类似算法:清空、求长度等,举一反三,p=head; /p是头结点的引用 while(p.getNext( )!=null
8、) if(x=p.getData( ) return true; else p= p.getNext( ); return false;,14,插入: 在线性表两个数据元素a和b间插入x,已知p指向a,算法描述,算法评价,注意前插入和后插入的区别,s.setNext(p.getNext( ); p.setNext(s);,15,算法描述,算法评价,删除:单链表中删除b,设p指向a,p.setNext(p.getNext( ).getNext( );,16,动态建立单链表算法:设线性表n个元素已存放在数组a中,建立一个单链表,h为头指针,h.setData(0); h.setNext(NULL)
9、; /依次在链表头部插入结点,次序是先插入最后一个,然后再插入前面元素 for(i=n;i0;i-) /注意i的变化 s=new SLNode( ); s.setData(ai-1); s.setNext(h.getNext( ); h.setNext(s); ,算法描述,算法评价,17,单链表原地逆序算法:设线性表n个元素已存放在链表a中,要求在不改变其元素位置的条件下将链表逆序排列,h为头指针,18,单链表原地逆序算法:设线性表n个元素已存放在链表a中,要求在不改变其元素位置的条件下将链表逆序排列,h为头指针,算法描述,算法评价,prv=NULL; /prv指示新链表的首元结点 /pt是变
10、化的未逆序部分链表的第一个结点 pt=h.getNext( ); while(pt!=NULL) tmp=pt.getNext( ); /取下一个结点 pt.setNext(prv); /当前结点指针指向自己前一个结点 prv=pt; /prv保存当前结点指针 pt=tmp; /pt指向下个结点 h.setNex(prv); /头指针指向新链表,19,答:能。只要定义一个结构类型(含数据域和指示域)数组,就可以完全描述链表,这种链表称为静态链表。 注:数据域含义与前面相同,指示域相当于前面的指针域。,讨论1: 用一维数组也能存放链表吗?怎样实现?,静态链表的插入与删除操作与普通链表一样,不需要
11、移动元素,只需修改指示器就可以了。,20,讨论2: 链表能不能首尾相连?怎样实现?,答:能。只要将表中最后一个结点的指针域指向头结点即可 (P.setNext(head);) 。这种形成环路的链表称为循环链表。,讨论3: 单链表只能查找结点的直接后继,能不能查找直接前驱?如何实现?,答:能。只要把单链表再多开一个指针域即可(例如用next和pre;) 。,双向链表在非线性结构(如树结构)中将大量使用。,这种有两个指针的链表称为双向链表。其特点是可以双向查找表中结点。,21,循环链表是表中最后一个结点p的指针指向头结点,使链表构成环状 p.setNext(head); 特点:从表中任一结点出发均
12、可找到表中其他结点,提高查找效率 操作与单链表基本一致,循环条件不同 单链表p=h.getNext( ); p!=NULL 循环链表p=h.getNext( ); p!=h,循环链表(circular linked list),22,双向链表(double linked list) 单链表具有单向性的缺点,Public class DLNode implements Node private Object element; private DLNode pre; private DLNode next; public DLNode( ) this(null,null,null); public
13、 DLNode( Object ele, DLNode pre, DLNode next) this.element=ele; this.pre=pre; this.next=next; public DLNode getNext( ) return next; public void setNext(DLNode next) this.next=next; public DLNode getPre( ) return pre; public void setPre(DLNode pre) this.pre=pre; public Object getData( ) return elemen
14、t; public void setData(Object obj ) element=obj; ,结点定义,23,双向链表(double linked list) 单链表具有单向性的缺点,结点定义,24,P,(p.getPre( ).setNext(p.getNext( ); (p.getNext( ).setPre(p.getPre( );,删除,算法描述,算法评价:T(n)=O(1),(p.getPre( ).setNext(p.getNext( );,(p.getNext( ).setPre(p.getPre( );,25,算法描述,算法评价:T(n)=O(1),x,S,插入,26,5
15、. 链表的运算效率分析,1. 查找 因线性链表不能顺序存取,即在查找时要从头指针找起,查找的时间复杂度为 O(n)。,时间效率分析,2. 插入和删除 因线性链表不需要移动元素,只要修改指针,一般情况下时间复杂度为 O(1)。,但是,如果要在单链表中进行前插或删除操作,由于要从头查找前驱结点,所耗时间复杂度为 O(n)。,27,练:,空间效率分析,链表中每个结点都要增加一个指针空间,相当于总共增加了n 个变量,空间复杂度为 O(n)。,在n个结点的单链表中要删除已知结点P,需找到它的 ,其时间复杂度为 。,前驱结点,O(n),28,线性表的实现与表示方法小结:,线性表逻辑结构特点是,只有一个首结
16、点和尾结点;除首尾结点外其他结点只有一个直接前驱和一个直接后继。简言之,线性结构反映结点间的逻辑关系是一对一(1:1)的。,问1:线性表的逻辑结构特点是什么?其顺序存储结构和链式存储结构的特点是什么?,答:,顺序存储时,相邻数据元素的存放地址也相邻(逻辑与物理统一);要求内存中可用存储单元的地址必须是连续的。,链式存储时,相邻数据元素可随意存放,但所占存储空间分两部分,一部分存放结点值,另一部分存放表示结点间关系的指针。,29,顺序存储的优点是存储密度大(1),存储空间利用率高。缺点是插入或删除元素效率低。 链式存储的优点是插入或删除元素时效率高,使用灵活。缺点是存储密度小(1),存储空间利用率低。,答:,问2:顺序存储和链式存储各有哪些优缺点?,事实上,链表插入、删除运算的快捷是以空间代价来换取时间。,30,本章小结,思考:在实际应用中如何选用顺序表和链表?,31
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 孩子自主能力如何提升
- 个人养老金制度2025年对绿色金融投资的影响与机遇分析报告
- 2025年电气化铁路牵引供电系统变压器行业当前市场规模及未来五到十年发展趋势报告
- 2025年特色幼儿教育行业当前发展趋势与投资机遇洞察报告
- 2025年妇幼医院行业当前发展趋势与投资机遇洞察报告
- 2025年轻型电动车行业当前市场规模及未来五到十年发展趋势报告
- 2025年保健器材行业当前市场规模及未来五到十年发展趋势报告
- 2025年航空锻件行业当前发展趋势与投资机遇洞察报告
- 围手术期药学服务优化
- 《电工技术》课件-项目三、正弦交流电路测试分析
- 职业健康检查委托协议书示范文本模板
- WJT9093-2018民用爆炸物品重大危险源辨识
- 企业师徒协议书范本
- GB/T 4502-2023轿车轮胎性能室内试验方法
- 全绩效考核制度:公司、营销人员、研发人员、生产人员绩效考核细则
- 熔铸作业指导书
- 外研版七年级英语下册全册单元测试卷(含答案解析)
- 酒精(乙醇)安全技术说明书(MSDS)
- 高速公路隧道机电系统工程技术交底
- 结婚函调报告表
- 冀教版小学数学三年级上册全册教案
评论
0/150
提交评论