第4课-循环链表及应用.课件.ppt
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《第4课-循环链表及应用.课件.ppt》由用户(三亚风情)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 循环 应用 课件
- 资源描述:
-
1、一、链表的其它几种形式: 静态链表(理解) 循环链表(掌握) 双向链表(掌握插入/ 删除算法)二、链表的应用(了解) 一元高次多项式的存储 集合类型的实现 有些高级程序设计语言中没有指针类型,但为了实现链表结构,有些高级程序设计语言中没有指针类型,但为了实现链表结构,应用其优点,可以通过定义一个结构体数组实现类似于应用其优点,可以通过定义一个结构体数组实现类似于“链表链表” 的的存储结构。存储结构。 该数组中的每个元素类似与线性表的该数组中的每个元素类似与线性表的“结点结点”,只是将结点中,只是将结点中的指针改为下标,用于指出后继在数组中的序号(相对位置),从的指针改为下标,用于指出后继在数组
2、中的序号(相对位置),从而形成静态链表结构。而形成静态链表结构。 由于它是由于它是利用数组定义利用数组定义的,数组的长度在编译时就确定,因此的,数组的长度在编译时就确定,因此在整个运算过程中链表存储空间的大小不会发生变化,故称这种结在整个运算过程中链表存储空间的大小不会发生变化,故称这种结构为构为静态链表。静态链表。 2.3.1 静态链表静态链表 #define MaxSize 1000 /*链表的最大长度链表的最大长度*/ /*定义存储数据元素的定义存储数据元素的“结点结点”类型类型 Snode*/ typedef struct ElemType data; /*存储数据元素的值存储数据元素
3、的值*/ int cur ; /*存储元素直接后继的下标存储元素直接后继的下标*/ Snode; /*定义静态链表类型定义静态链表类型SlinkList结构体数组类型结构体数组类型*/ typedef Snode SlinkListMaxSize; 理解:理解: 静态链表中的用于存储每个数据元素的静态链表中的用于存储每个数据元素的结点也结点也有数据域有数据域datadata和指向和指向下个元素存储位置的域下个元素存储位置的域curcur,不过这里的,不过这里的curcur是个下标是个下标, ,是相对数组第一是相对数组第一个元素的偏移个元素的偏移, ,属于相对地址属于相对地址. .但是所起的作用
4、与线性链表中的指针但是所起的作用与线性链表中的指针nextnext相同,因此称为静态指针。相同,因此称为静态指针。 为了简化链表操作算法为了简化链表操作算法, ,静态链表也可以设表头结点静态链表也可以设表头结点. . 设有变量设有变量s s定义定义: : Slinklist Slinklist s; / s; /* *s s 为一个静态链表为一个静态链表 * */ / 则则s0s0表示头结点表示头结点,s0.cur,s0.cur指示指示第一个元素结点的位置第一个元素结点的位置 si.datasi.data 表示第表示第i i个数据元素的值个数据元素的值 si.cursi.cur 指示指示第第i
5、 i个元素的直接后继个元素的直接后继, ,即第即第i+1i+1个元素的存储位置个元素的存储位置 如图(如图(a) a) 在链表没有使用前,各个结点已经形成一个链,变量在链表没有使用前,各个结点已经形成一个链,变量AVAV指示链表的首地址指示链表的首地址( (头结点头结点) )。由。由AVAV指向的链表称为可利用空间表,指向的链表称为可利用空间表,可用于管理结点的分配和回收。可用于管理结点的分配和回收。012345678-12345678-1datanextheadAVAVAV未用空间创建头结点插入链表插入多个后链表状态(a)(b)(c)(d)30306078258612325501234567
6、812345678-1datanextAV0123456781-1345678-1datanexthead01234567862387-1415datanexthead303060782582122386 带头结点的静态链表操作的 算法逻辑与线性链表相似,不过有以下区别: 1.需要用户自己实现类似于malloc和free函数的操作. 2.线性表中向后移动指针的操作:p=p-next 改为k =si.cur 算法2.14:管理分配给链表的空闲结点 算法2.15:实现结点的分配,即从空白表获取一个结点 算法2.16:实现结点的回收,即将删除的结点链接到空白表 循环链表循环链表(Circular L
7、inked List)是另一种形式的链式存储是另一种形式的链式存储结构。它将单链表中最后一个结点的指针指向链表的头结点,结构。它将单链表中最后一个结点的指针指向链表的头结点,使整个链表头尾相接形成一个环形。这样,使整个链表头尾相接形成一个环形。这样,从链表中任一结从链表中任一结点出发,顺着指针链都可找到表中其它结点点出发,顺着指针链都可找到表中其它结点。循环链表的最。循环链表的最大特点是不增加存储量,只是简单地改变一下最后一个结点大特点是不增加存储量,只是简单地改变一下最后一个结点的指针指向,就可以使操作更加方便灵活。的指针指向,就可以使操作更加方便灵活。2.3.2 循环单链表循环单链表hea
8、d.a1a2aian(a ) 带头结点的空循环链表(b ) 带头结点的循环链表head循环链表结构示意图循环链表结构示意图 带头结点的单循环链表的操作算法和带头结点的单链表带头结点的单循环链表的操作算法和带头结点的单链表的操作算法相似,差别仅在于算法中的判断循环终止的条件的操作算法相似,差别仅在于算法中的判断循环终止的条件不同。循环链表中:不同。循环链表中: 指针指针p指向表尾的条件:指向表尾的条件:p-next=head 表空条件:表空条件:head-next=head 例:例: 求线性表长度求线性表长度Getlen(L)函数、查找运算函数、查找运算locate(L,x)函数、链表元素输出运
9、算函数、链表元素输出运算displist(L)函数中,循环是函数中,循环是否进行的条件由否进行的条件由p!=NULL改为改为p!=L; 此外,还可用尾指针表示循环链表此外,还可用尾指针表示循环链表 。 尾指针尾指针tail指向最后一结点,沿最后一个结点的指针指向最后一结点,沿最后一个结点的指针又可立即找到链表的第一个结点。在实际应用中,使又可立即找到链表的第一个结点。在实际应用中,使用尾指针来代替头指针进行某些操作往往会更简单。用尾指针来代替头指针进行某些操作往往会更简单。【例例1】将两个循环链表首尾相接进行合并,将两个循环链表首尾相接进行合并, La、Lb分别为两个循环链表的分别为两个循环链
10、表的尾指针尾指针,对两个单循环,对两个单循环链表链表La,Lb进行的连接操作,是将进行的连接操作,是将Lb的第一个数据结的第一个数据结点接到点接到La的尾部。的尾部。head指向合并后的链表的指向合并后的链表的头结点头结点。【解】算法思路:【解】算法思路: 在循环链表中若采用尾指针在循环链表中若采用尾指针La,Lb来标识,则时间性来标识,则时间性能将变为能将变为O(1)。其连接过程如图所示。其连接过程如图所示。LbLa(a)连接前p = L a-next;q=Lb-next.a1a2aian.b1b2bibnLaLb.a1a2aian.b1b2bibn(b)连接后L a - next=q-ne
11、xt;Lb-next=p;free(q)headpq图图2-14 两个循环链表首尾相接进行合并两个循环链表首尾相接进行合并 操作如下:操作如下:/*La,Lb为带头结点的循环单链表的尾指针为带头结点的循环单链表的尾指针*/LinkList listMerge(LinkList La,LinkList Lb) LNode *p, *q; p=La-next; /*p指向第一个链表的头结点指向第一个链表的头结点*/ q=Lb-next; /*q指向第二个链表的头结点指向第二个链表的头结点*/ La-next=q-next; /*将链表将链表Lb链接到链接到La的尾部的尾部*/ Lb-next=p;
12、 /*设置链表的尾指针设置链表的尾指针*/ free(q); /*释放多余的头结点释放多余的头结点*/ return Lb; /*返回新链表的尾指针返回新链表的尾指针*/2.3.3 双向链表双向链表 双向链表结点的定义如下:双向链表结点的定义如下: typedef struct Dnode ElemType data; struct DNode *prior; struct DNode *next; Dnode,*DuLinkList; 双向链表是用两个指针表示结点间的逻辑关系。即增加了一个双向链表是用两个指针表示结点间的逻辑关系。即增加了一个指向其直接前驱的指针域,这样形成的链表有两条不同方
13、向的链,指向其直接前驱的指针域,这样形成的链表有两条不同方向的链,前驱和后继,因此称为双链表。前驱和后继,因此称为双链表。 在双链表中,根据已知结点查找其直接前驱结点可以和查找其在双链表中,根据已知结点查找其直接前驱结点可以和查找其直接后继结点一样方便。这里也仅讨论带头结点的双链表。仍假设直接后继结点一样方便。这里也仅讨论带头结点的双链表。仍假设数据元素的类型为数据元素的类型为ElemType。priordatanexta1a2an.(a)空双向链表(b )非 空双向链表headhead带头结点的双向链表带头结点的双向链表 如果指针变量如果指针变量 p 指向了一个结点,则通过指向了一个结点,则
14、通过 p-next 可以直接访问该结点可以直接访问该结点的后继结点,也可以由指针的后继结点,也可以由指针p-prior直接访问它的前驱结点。这种结构极直接访问它的前驱结点。这种结构极大地简化了某些操作。大地简化了某些操作。 在双向链表中也可采用与单链表类似的方法,设置头结点。在双向链表中也可采用与单链表类似的方法,设置头结点。用头指针标识链表的存在。用头指针标识链表的存在。 注意:指针操作序列,操作注意:指针操作序列,操作必须在操作必须在操作之前完成。之前完成。ai-1xs-data=xsaipai-1saip(a)插入前的状态x(b)插入过程关键语句:s -prior=p-prior;s -
15、next=p;p -prior=s;s -prior-next=s;q -next-prior=p;.ai-1aiqai+1ai-1aiqai+1(a)删除前状态( b) 删除过程.关键语句:p -next=q-next;f ree(q)pp 在双向链表中找到删除位置的前一个结点,由在双向链表中找到删除位置的前一个结点,由p指向它,指向它,q指向要删除的指向要删除的结点。删除操作如下:结点。删除操作如下:将将*p的的next域改为指向待删结点域改为指向待删结点*q的后继结点;的后继结点;若若*q不是指向最后的结点,则将不是指向最后的结点,则将*q之后结点的之后结点的prior域指向域指向*p。
16、 注意:在双向链表中进行插入和删除时,对指针的修改需要同时修改注意:在双向链表中进行插入和删除时,对指针的修改需要同时修改结点的前驱指针和后继指针的指向。结点的前驱指针和后继指针的指向。 2.4.1 一元多项式表示一元多项式表示 链式存储结构的链式存储结构的典型应用之一是典型应用之一是在高等数学的在高等数学的多项式方面。本节主要多项式方面。本节主要讨论采用链表结构表示的一元多项式的操作处理。在数学上,一个一讨论采用链表结构表示的一元多项式的操作处理。在数学上,一个一元多项式元多项式Pn(x) 可以表示为可以表示为 : Pn(x)=a0+a1x+a2x2+anxn (最多有最多有n+1项项) a
展开阅读全文