循环链表和双向链表.ppt
《循环链表和双向链表.ppt》由会员分享,可在线阅读,更多相关《循环链表和双向链表.ppt(38页珍藏版)》请在三一文库上搜索。
1、目 录5.1带头结点的链表5.2循环链表5.3 双向链表5.4 线性表的应用示例5.1几种特殊线性链表几种特殊线性链表 5.1 带头结点的链表 有时候为了处理上的方便,在线性链表的第一个结点的有时候为了处理上的方便,在线性链表的第一个结点的前面前面增设一个特殊的结点,称为头结点增设一个特殊的结点,称为头结点。头结点逻辑上不属。头结点逻辑上不属于相应的线性链表,它的作用主要有两点,一是存贮一些有于相应的线性链表,它的作用主要有两点,一是存贮一些有关线性表的信息(如表中结点总数关线性表的信息(如表中结点总数),另一是为了算法),另一是为了算法处理上的方便。处理上的方便。图图 5 1 带头结点的链表
2、带头结点的链表1020303 头指针头结点头元素5.2 循环链表循环链表 图图5 2 循环单链表示意循环单链表示意20(a)不带头结点不带头结点(b)带头结点带头结点10303 n在线性表中,如果我们将第在线性表中,如果我们将第1 个结点视为最后一个个结点视为最后一个结点的后继,将最后一个结点视为第结点的后继,将最后一个结点视为第1个结点的前个结点的前趋,则这种线性表称为循环线性表,相应的链表称趋,则这种线性表称为循环线性表,相应的链表称循环线性链表(简称循环链表)。循环线性链表(简称循环链表)。1020305.3 双向链表双向链表 为单向链表的每个结点增设一个指向相应结点为单向链表的每个结点
3、增设一个指向相应结点的前趋的指针,使其同时包含前驱和后继,这样的的前趋的指针,使其同时包含前驱和后继,这样的链表称为双向链表(简称双链表)。双向链表的结链表称为双向链表(简称双链表)。双向链表的结点的结构如下所示:点的结构如下所示:这里各项含义为:这里各项含义为:info-存放元素内容;存放元素内容;next-存放该元素的后继的指针(地址);存放该元素的后继的指针(地址);prior-存放该元素的前驱的指针(地址);存放该元素的前驱的指针(地址);priorinfonext循循环环单单链链表表是是单单链链表表的的另另一一种种形形式式,其其结结构构特特点点是是链链表表中中最最后后一一个个结结点点
4、的的指指针针不不再再是是结结束束标标记记,而而是是指指向向整整个个链链表表的的第第一一个个结结点点,从从而而使使单单链链表表形形成成一一个个环环。和和单单链链表表相相比比,循循环环单单链链表表的的长长处处是是从从链链尾尾到到链链头头比比较较方方便便。当当要要处处理理的的数数据据元元素素序序列列具具有有环环型型结结构构特特点点时时,适适合合于于采采用用循循环环单单链链表表。循循环环链链表表的的插插入入、删删除除运运算算基基本本同同单单向向链链表表,只只是是查查找找时时判判别别条条件件不不同同而而已已;但但是是这这种种循循环环链链表表实实现现各各种种运运算算时时的的危危险险之之处处在在于于:链链表
5、表没没有有明明显显的的尾尾端端,可可能能使使算算法法进进入入死死循循环环,所所以以判判断断条条件件应应该该用用curr.next()!=headcurr.next()!=head替替换换单单向向链链表表的的curr.next()!=nullcurr.next()!=null完成遍历所有结点。完成遍历所有结点。(一)双链表的插入(一)双链表的插入 现设在结点p之前插入结点q,其程序片段如下。(1)q-next=p;/让q的next指向p(2)q-prior=p-prior;(3)p-prior-next=q;(4)p-prior=q;图5 3 双链表插入pp-priorp-next(4)q(3)
6、2)(1)注意关键的四个指针注意关键的四个指针域的变化域的变化(2)(1)pp-priorp-next图 5 4双链表的删除(二)双链表删除(二)双链表删除 现设删除结点p所指结点,程序片段如下。(1)p-prior-next=p-next;(2)p-next-prior=p-prior;(3)return p;注意:关键的两个指针域的变化5.4 线性表应用示例线性表应用示例 5.4.1 集合运算 对集合结构,一般可用线性表表示。所以,对集合的操作,可以在线性表上进行。这里只从算法角度介绍一种集合运算-(A-B)(B-A)的实现 为了说明前面给出的线性表类的使用,我们的实现在类TLinear
7、ListSqu的基础上进行。对应的子程序如下。A-BB-AAB(A-B)(B-A)=(AB)-(AB)long DiDiff(TLinearListSqu&a,TLinearListSqu&b)/将将a中的出现在中的出现在b中的元素删除,返回从中的元素删除,返回从a中删除的元素的数中删除的元素的数/目目 a和和b都是前面定义的线性表类,都是前面定义的线性表类,元素类型实例化为元素类型实例化为long。long i,j,k;j=0;for(i=0;i 0)/如在如在a中,则从中,则从a中将其删除中将其删除 a.Delete(k+1);j-;Else a.Insert(b.Get(i),1);j+
8、return j;先在B表中取得元素i的值,然后根据该值,查找属于A表中的第一个等于该值的序号,由于表的起始序号为0,故加1体现类模板的作用体现类模板的作用5.5一元多项式相加一元多项式相加(一)一元多项式的表示数据结构 在数学上,一个一元在数学上,一个一元n次多项式可表示为次多项式可表示为 Pn(x)=p0+p1x+p2x2+pnxn它由它由(n+1)个系数序列个系数序列p0、p1、pn 唯一地确定。因此,在唯一地确定。因此,在计算机中,它可用一个线性表计算机中,它可用一个线性表P来表示:来表示:P=(p0,p1,pn)其中,其中,pi代表代表Pn(x)中的中的i次项系数。次项系数。在这种表
9、示法中,在这种表示法中,系数所对应的指数隐含在系数的序号中,所系数所对应的指数隐含在系数的序号中,所以值为以值为0的系数也要列出。的系数也要列出。现考虑两多项式进行符号相加的问题。设现考虑两多项式进行符号相加的问题。设Qm(x)是另一个一元是另一个一元m次多项式,它的线性表表示为次多项式,它的线性表表示为 Q=(q0,q1,qm)为解决为解决0系数问题,可以不存贮系数问题,可以不存贮0值元素。但这样值元素。但这样就不能利用位置关系隐含指出系数对应的指数了,就不能利用位置关系隐含指出系数对应的指数了,而必须显式地给出指数。而必须显式地给出指数。对任一个一元对任一个一元n次多项式,若不写出系数为次
10、多项式,若不写出系数为0的项,的项,则可表示为则可表示为pn(x)=p1xe1+p2xe2+pnxen 这里,这里,p1,p2,pn均非均非0,e1e2 en=n。显然,对此形式多项式,可确定地用下列形式的显然,对此形式多项式,可确定地用下列形式的线性表表示线性表表示(p1,e1),(p2,e2),(pn,en)该线性表每个元素是个二元组该线性表每个元素是个二元组(pi,ei),分别指出第,分别指出第i个非个非0项的系数和指数,二元组按指数递增的次序排项的系数和指数,二元组按指数递增的次序排列。列。在这种结构中,元素之间的次序关系仅代表元在这种结构中,元素之间的次序关系仅代表元素对应的指数的大
11、小关系。素对应的指数的大小关系。n对这种线性表,既可用顺序存贮结构,也可用链式对这种线性表,既可用顺序存贮结构,也可用链式存贮结构。但考虑到在进行符号加法时,要经常进存贮结构。但考虑到在进行符号加法时,要经常进行插入与删除操作,所以采用链式存贮结构较为合行插入与删除操作,所以采用链式存贮结构较为合适。这里,我们采用动态链式存贮结构,线性表每适。这里,我们采用动态链式存贮结构,线性表每个元素的结构为个元素的结构为系数指数它的它的C/C+语言描述为语言描述为struct TPolynomialItem float coef;int exp;该类型在我们前面给出的线性表中,相当于元素类型该类型在我们
12、前面给出的线性表中,相当于元素类型TElem,在具体使用线性表类时,应使用,在具体使用线性表类时,应使用TPolynomialItem实例化实例化TElem对应的类模板对应的类模板 为处理方便,在具体存储多项式时,为处理方便,在具体存储多项式时,我们规定:我们规定:所存储的多项式已约简,即已合并同类项,不保所存储的多项式已约简,即已合并同类项,不保留留0系数项,各项按指数的升序排列。系数项,各项按指数的升序排列。(二)多项式加法实现二)多项式加法实现直接操作链表直接操作链表 为操作方便,我采用带头结点的非循环链表,下面给出为操作方便,我采用带头结点的非循环链表,下面给出一个例子说明多项式的这种
13、表示法。一个例子说明多项式的这种表示法。设有一个一元设有一个一元5次多项式:次多项式:P5(x)=7+3x-9x3+x5 具体链表表示方法如图具体链表表示方法如图 5 5 一元一元n次多项式的(符号)相加,实质上是合次多项式的(符号)相加,实质上是合并同类项的过程,即指数相同的项,其系数相加,并同类项的过程,即指数相同的项,其系数相加,指数不同的项复抄。指数不同的项复抄。7031-9 315 图图 5 5 一个一元一个一元5次多项式的链表表示次多项式的链表表示下面考虑下面考虑A(x)+B(x)A(x)A(x)+B(x)A(x)的实现方法。即将多项式的实现方法。即将多项式B(x)B(x)加加到多
14、项式到多项式A(x)A(x)上面,这里假设各多项式均已约简,且各项已上面,这里假设各多项式均已约简,且各项已按升序排列。按升序排列。用高级语言实现时,设两个指针用高级语言实现时,设两个指针p p和和q q,初始时它们分别指,初始时它们分别指向向A(x)A(x)与与B(x)B(x)中当前未被处理的结点中指数最小者。进行相中当前未被处理的结点中指数最小者。进行相加的过程,实质上是重复进行下列几个步骤:加的过程,实质上是重复进行下列几个步骤:(1 1)若若pexpqexp,pexpqexp pexpqexp,则结点,则结点q q应为和的一个结点,应为和的一个结点,故应将故应将q q 从从B(x)B(
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 循环 双向
