第三节双向链表与循环.pptVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第三节双向链表与循环

第三节 双向链表与循环链表 什么是双向链表? 前面我们学习了线性链表,也称单链表,其每个结点只有一个指针域,由这个指针只能找到结点的后继或前驱,也就是说只能顺着指针单方向进行扫描,这对于某些问题的处理会带来不便。为了弥补单链表的这个缺点,在某些应用中,每个结点设置两个指针,分别指向前驱和后继。如下图所示: 这种结点用C语言结构体定义如下: struct dou_node { 数据成员表; struct dou_node * prev; struct dou_node * next; } 双向链表的删除运算 p↑.prev.↑.next=p↑.next; p↑.next.↑.prev=p↑.prev; 双向链表的插入运算 ①s↑.prev=p↑.prev; ②p↑.prev↑.next=s; ③s↑.next=p; ④ p↑.prev=s; 思考: ① ② ③ ④之间的顺序是否唯一呢? 答案:并非唯一 原理:只要满足下列条件即可: 设A是含指针符号的任意项 那么,A出现在左边的式子必须在含A式子的后面。 实例说明 在上述例子四个式子中,A可以是s↑.prev、 p↑.prev、 p↑.prev↑.next、 s↑.next。而且先后都出现在式子的左边; 下面一个一个分析,分析中发现只有p↑.prev重复出现。因此只要判断这一个即可。 p↑.prev出现在左边是式子是④,含p↑.prev的式子有① ② ,所以根据以上原理可推出: ④式必须在① ② 式后面。 满足这一点的所有序列均可。 循环链表 循环链表是另一种形式的链式存储结构。它的特点是表中最后一个结点的指针域指向头结点,整个链表形成一个环。 因此,从表中任一结点出发均可找到表中其他结点。 上述两种形式的链表结合就是循环双向链表。 第四章 字符串模式匹配算法 什么是模式匹配 在一般的编辑软件中,经常要遇到在一个给定的文本中检测一个特定的字符串的问题,这就是字符串匹配,也称模式匹配。 设P是一个模式字符串(简称模式),其长度为m;s是一个正文字符串(简称正文),其长度为n。通常认为nm。(示例) 简单算法 算法描述: 从正文s和模式p的第一个字符出发,将s和p的字符依次逐个进行比较,如果p中的所有字符均与s中的对应字符匹配,则说明匹配成功;如果在比较过程中发现了一个字符不匹配,则将模式p沿正文s向后移动一个字符的位置,然后再从p的第一个字符开始与中的对应字符逐个进行比较。以此类推,直到匹配成功或到达的末段为止。 算法实现 PROCEDURE ZFQPP(s,p,n,m,flag,i) i=1; j=1; While(i=n-m and j=m ) do If( s[i]=p[j] ) { i=i+1; j=j+1 } Else { i=i-j+2; j=1 } If (jm) return(i-m) else return(0) end 模式匹配的KMP算法 基本思想: 当模式p与正文s进行比较的过程中发现不匹配时,找到一种模式p沿正文s向后移动的规则,以便使得正文s中失去匹配的字符以前的字符不再参与比较,即只从当前失去匹配的字符开始与模式p中的字符继续依次进行比较,并且又不错过模式被发现的机会。 示例: 算法分析 假设正文为‘s1s2……sn’,模式为‘p1p2……pn’,要实现改进算法,也就是要解决下述问题:当匹配过程中产生失配时(即si != pj),模式“向右滑动”可行的距离有多远,换句话说,当正文中第i个字符与模式中第j个字符“失配”时,正文中第i个字符应与模式中哪个字符相比较? 假设此时应与模式中第k个字符继续比较,其中k应具有以下两个性质: 1、kj,因为当失配时必然使模式p向后移,从而导致kj。移的幅度越小,k与j相差越小。 2、k应取所有可能值中的最大值,因为取最大值就意味着移的幅度越小,也就避免错过成功匹配的机会。 根据这个假设,必然使得下式成立: ‘p1p2……pk-1’=‘si-k+1si-k+2……si-1’ (1) 而已经得到的“部分匹配”的结果是: ‘pj-k+1pj-k+2……pj-1’=‘si-k+1si-k+2……si-1’ (2) (2)式的由来是: 当初正文中的第i个字符与模式中的第j个字符失配时,说明两者之前的(j-1)个字符肯定是一样的,而kj,所以前k个字符也是相同的。这就得出(2)式。 由(1)(2)两式便可得: ‘p1p2……pk-1’= ‘pj-k+1pj-k+2……

文档评论(0)

cgsx259 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档