zoukankan      html  css  js  c++  java
  • 线性表16:双向链表 数据结构和算法21

    线性表16 : 双向链表

     

    让编程改变世界

    Change the world by program


        这货我们地球人把他称为火车,有了它,全世界每年春季最大规模的物种迁移才会发生在中国!  

    双向链表

      大家都知道,任何事物出现的初期都显得有些不完善。例如我们的火车刚发明的时候是只有一个“头”的,所以如果它走的线路是如下: A->B->C->D->E->F->G->H->I->J->K->L->A   假设这会儿火车正停在K处呢,要他送一批货到J处,那么它将走的路线是: K->L->A->B->C->D->E->F->G->H->I->J   嗯,所以后来我们的火车就都有两个头了。看完这个例子,大家就明白双向链表的必要性了吧。  

    双向链表结点结构

      [codesyntax lang="c"]
    typedef struct DualNode
    {
    	ElemType data;
    	struct DualNode *prior;  //前驱结点
    	struct DualNode *next;   //后继结点
    } DualNode, *DuLinkList;
    [/codesyntax]     [caption id="attachment_2002" align="alignnone" width="500"] 双向链表的结构[/caption]   既然单链表可以有循环链表,那么双向链表当然也可以有。   [caption id="attachment_2003" align="alignnone" width="500"] 双向链表循环[/caption]   在这里小甲鱼问大家一个问题:由于这是双向链表,那么对于链表中的某一个结点p,它的后继结点的前驱结点是什么?  

    双向链表的插入操作

      插入操作其实并不复杂,不过顺序很重要,千万不能写反了。   [caption id="attachment_2004" align="alignnone" width="500"] 双向链表的插入操作[/caption]  

    代码实现:

    [codesyntax lang="c"]
    s->next = p; 
    s->prior = p->prior; 
    p->prior->next = s; 
    p->prior = s;
    [/codesyntax]   关键在于交换的过程中不要出现矛盾,例如第四步先被执行了,那么p->prior就会提前变成s,使得插入的工作出错。 严重性打个比方就是打电话给老婆的时候不小心叫成小三的名字!  

    双向链表的删除操作

      如果刚才的插入操作理解了,那么再来理解接下来的删除操作就容易多了。   [caption id="attachment_2005" align="alignnone" width="500"] 双向链表的删除操作[/caption]  

    代码实现:

    [codesyntax lang="c"]
    p->prior->next = p->next;
    p->next->prior = p->prior; 
    free(p);
    [/codesyntax]   最后总结一下,双向链表相对于单链表来说,是要更复杂一点,每个结点多了一个prior指针,对于插入和删除操作的顺序大家要格外小心。 不过,双向链表可以有效提高算法的时间性能,说白了就是用空间来换取时间。  

    本章节结束语

      主题:力争做一只逆流而上的小甲鱼! [buy] 获得所有教学视频、课件、源代码等资源打包 [/buy] [Downlink href='http://kuai.xunlei.com/d/BdsUAwoZVQCHkxNR645']视频下载[/Downlink] [Downlink href='http://urlxf.qq.com/?ZNvUNvE']备胎下载[/Downlink]
  • 相关阅读:
    封装成帧、帧定界、帧同步、透明传输(字符计数法、字符串的首尾填充法、零比特填充的首尾标志法、违规编码法)
    计算机网络之数据链路层的基本概念和功能概述
    物理层设备(中继器、集线器)
    计算机网络之传输介质(双绞线、同轴电缆、光纤、无线电缆、微波、激光、红外线)
    计算机网络之编码与调制
    0953. Verifying an Alien Dictionary (E)
    1704. Determine if String Halves Are Alike (E)
    1551. Minimum Operations to Make Array Equal (M)
    0775. Global and Local Inversions (M)
    0622. Design Circular Queue (M)
  • 原文地址:https://www.cnblogs.com/LoveFishC/p/3846285.html
Copyright © 2011-2022 走看看