1.双向链表的定义

双向链表是在单链表的每个结点里再增加一个指向其直接前驱的指针域prior,这样链表就形成了有两个方向不同的链

//双向链表的结点结构体
struct DuLinkNode
{Elemtype data;  //数据域struct DuLNode* prior;  //前驱指针域struct DuLNode* next;  //后继指针域
};
typedef DuLinkNode* DuLinkList;  //DuLinkList表示双向链表,DuLinkNode* 表示单个结点

2.双向循环链表的定义

双向循环链表就是在双向链表的基础上,让头结点的前驱指针指向链表的最后一个结点,让最后一个结点的后继指针指向头结点

3.双向循环链表的对称性

p结点前驱结点的后继也是p结点,后继结点的前驱也是p结点

4.双向链表的操作概述

求链表长度、找第pos个位置的数据等操作只涉及一个方向的指针,所以它们的算法与单链表相同。但在进行插入、删除等操作时,会涉及两个方向的指针。

5.双向链表的插入操作

//在带头结点的双向循环链表L的第i个位置插入数据域为e的结点
void ListInsert_Du(DuLinkList &L, int i, Elemtype e)
{//先找到第i个位置的指针pDuLinkNode *p = new DuLinkNode;p = L->next; //从首结点开始int k = 0;while((p != NULL) && (k < i)){p = p->next;k++;}//创建一个新结点sDuLinkNode *s = new DuLinkNode;//将s结点的数据域赋值为es->date = e;//把s的前驱指针指向第i个位置的前一个结点s->prior = p->prior;//将第i个位置的前一个结点的后继指针指向s结点p->prior->next = s;//将s结点的后继指针指向ps->next = p;//将p结点的前驱指针指向sp->prior = s;
}

6.双向链表的删除操作

//删除带头结点的双向循环链表L的第i个位置的结点
void ListDelete_Dul(DuLinkList &L, int i)
{//先找到第i个结点pDuLinkNode *p = new DuLinkNode;p = L->next;int k = 0;while((p != NULL) && (k < i)){p = p->next;k++;}//将第i个位置的前一个结点的后继指针指向第i个位置的后一个结点p->prior->next = p->next;//将第i个位置的后一个结点的前驱指针指向第i个位置的前一个结点p->next->prior = p->prior;
}

7.链表和顺序表的比较

链表的优点:(1) 存储空间可以动态分配和释放。(2) 删除和修改链表时,不需要移动结点,只需修改指针。

链表的缺点:(1) 存储空间比较大,存储密度小,因为每个结点的指针都需要额外的空间来存储。(2) 链表是非随机存取结构,对任一结点的操作都要从头指针依次指到指定的结点,增加了算法的复杂度。

顺序表的优点:(1) 存储密度为1,因为只需存储结点数据本身,不用为表示结点间的逻辑关系而增加额外的存储空间。(2) 随机存取,直接通过下标来存取。

顺序表的缺点:(1) 需要预先分配空间,可能会导致空间的浪费和溢出。(2) 删除和修改顺序表时,要移动结点本身,时间开销较大。

【数据结构】四、双向链表和双向循环链表相关推荐

  1. 数据结构系列2——双向链表和双向循环链表

    目录 一.双向链表 1.双向链表的封装和创建 2.双向链表的简单操作 1.头插法插入节点 2.尾插法插入节点 3.指定位置插入 4.表头法删除 5.表尾法删除 6.从头往尾打印节点数据 7.从尾往头打 ...

  2. (C++版)链表(四)——实现双向循环链表创建、插入、删除等简单操作

    http://blog.csdn.net/fisherwan/article/details/25649271 链表(四)实现双向循环链表简单操作,代码如下: [cpp] view plain cop ...

  3. c语言中next和prior连在一起,C语言中双向链表和双向循环链表详解

    双向链表和双向循环链表 和单向链表相比,多了一个前驱结点.如果他为空,那么next和prior都指向自己.而对于双循环链表,只需要最后一个元素的next指向head->next,head-> ...

  4. 数据结构与算法 | 带头双向循环链表

    上一节里实现的是最简单的链表,在实际中那种链表不会单独用来存储数据,更多是作为其他数据结构的子结构,如图的邻接表等.而比较常用的就是带头双向循环链表. 通过对比我们可以看出有三个不同,多了头节点,链表 ...

  5. (C语言版)链表(四)——实现双向循环链表创建、插入、删除、释放内存等简单操作

    http://blog.csdn.net/fisherwan/article/details/19801993 双向循环链表是基于双向链表的基础上实现的,和双向链表的操作差不多,唯一的区别就是它是个循 ...

  6. 【数据结构】-关于带头双向循环链表的增删查改

    作者:低调 作者宣言:写好每一篇博客 文章目录 前言 一.带头双向循环链表的实现 1.1创建返回链表的头结点 1.2开辟一个新的结点 1.3双向链表的销毁 1.4双向链表的打印 1.5双向链表尾插 1 ...

  7. 数据结构(三)---双向循环链表的实现---java版

    节点设置 package com.cn.hbut.domain; /**  * @author Administrator  * 双向循环链表的节点设置  */ public class DNode ...

  8. 【数据结构】带头节点双向循环链表

    目录 顺序表和链表的区别 带头双向循环链表分析 带头双向循环链表结构: 创建一个节点 哨兵位头节点 打印链表中的值 在pos前插入 删除pos位置的节点 尾插 尾删 头插: 头删 链表元素查找 总代码 ...

  9. java与数据结构(4)---java实现双向循环链表

    线性表之链式存储结构双向循环链表 双向循环链表:每个结点包含了数据.直接前驱地址指针和直接后驱地址指针,头结点的直接前驱指向尾结点,尾结点的直接后驱指向头结点,头尾相连构成一个可正可反的圆环.可以形象 ...

  10. 从无到有算法养成篇-双向链表与双向循环链表

    一.双向链表 1.定义:从下图中的定义结点的代码我们能发现,双向与单向最明显的区别就是是否可以反向查找上一结点. 定义 2.创建:大致和单向的创建差不多,区别在于多了prior的处理 步骤: 1.*L ...

最新文章

  1. Webpack构建多页应用心得体会
  2. Oracle Scheduler - NLS_ENV
  3. HTML与CSS基础之兄弟元素(六)
  4. 关于微信内置浏览器,打开图片上传功能,调用的问题
  5. clientdataset1.filter like怎么用_除了like, 英语还能这样说“喜欢”!
  6. C++ C++11新特性--右值引用
  7. spring mvc 接收表单 bean
  8. 【Android游戏开发二十】物理游戏之重力系统开发,让你的游戏变得有质有量!...
  9. [Android] Android开机启动Activity或者Service方法
  10. Julia:几个简单的类型转换
  11. 蜜罐合约-老版本solidity引用类型的一个坑
  12. Vue安装必要插件element-ui插件及axios依赖(详细)
  13. 一文学会如何使用工厂模式
  14. Excel 2016添加复选框
  15. 微前端框架 之 qiankun
  16. 迷惑新手的IOS开发问题
  17. 仓管员的个人年终总结pos维护调度年终总结
  18. js按下回车键调用方法
  19. of介词短语作定语_of介词短语作表语
  20. 计算机部分应用显示模糊,电脑显示器局部模糊怎么办

热门文章

  1. 怎么在win10服务器上搭建网站,win10怎么搭建web服务器 win10搭建web服务器的方法...
  2. APP性能测试工具——GT 使用方法
  3. jquery-migrate.min.js兼容jQuery版本
  4. 景区分时实名预约系统
  5. 何凯明最新一作:Masked Autoencoders Are Scalable Vision Learners
  6. qq远程卡主,只能看到桌面,鼠标、键盘操作不了的解决方法
  7. 零基础如何学习PLC
  8. 淘宝千万级并发架构的十四次演进
  9. ios备忘录下载安卓版_苹果备忘录app下载
  10. Django序列化django REST framework