http://www.cnblogs.com/jingliming/p/4602144.html#0-tsina-1-42616-397232819ff9a47a7b7e80a40613cfe1

一、双向链表的定义

  双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。一般我们都构造双向循环链表。

  注意:在实现的过程中,要分清前驱指针和后继指针,不要把他们当成一个指针。

1 //双向链表的实现
2 template<typename T>struct node{
3     T data;
4     node<T> *prior,*next;
5 };
回到顶部(go to top)

二、双向链表的实现

  1 template<typename T>class nLink
  2 {
  3 private:
  4     node<T> *head;
  5 public:
  6     nLink()
  7     {
  8         head=new node<T>;
  9         head->next=head->prior=NULL;
 10     }
 11     ~nLink()
 12     {
 13
 14     }
 15     //清空双链表
 16     void clearLink()
 17     {
 18         node<T> *p=head->next,*q=NULL;
 19         while(p)
 20         {
 21             q=p->next;
 22             delete p;
 23             p=q;
 24         }
 25         head->next=NULL;
 26     }
 27     //销毁双链表
 28     void destoryLink()
 29     {
 30         clearLink();
 31         if (head)
 32         {
 33             delete head;
 34             head=NULL;
 35         }
 36     }
 37     //打印双链表
 38     void printLink()
 39     {
 40         node<T> *p=head->next;
 41         while(p)
 42         {
 43
 44             cout<<p->data<<" ";
 45             p=p->next;
 46         }
 47         cout<<endl;
 48     }
 49     //在双链表末尾添加结点
 50     bool appendLink(T e)
 51     {
 52         node<T> *p=head,*s=NULL;
 53         s=new node<T>;
 54         if (s==NULL)
 55             return false;
 56         s->data=e;
 57         s->next=s->prior=NULL;
 58         while(p->next)
 59         {
 60             p=p->next;
 61         }
 62         p->next=s;
 63         s->prior=p;
 64         return true;
 65     }
 66     //获取链表的长度
 67     int length()
 68     {
 69         node<T> *p=head;
 70         int lenth=0;
 71         if (p==NULL)
 72             return 0;
 73         while(p)
 74         {
 75             p=p->next;
 76             lenth++;
 77         }
 78         return lenth;
 79     }
 80     //在第pos个位置插入新节点
 81     bool insertLink(int pos,T e)
 82     {
 83         node<T> *p=head;
 84         int posflag=0;
 85         while(p&&posflag<pos-1)
 86         {
 87             p=p->next;
 88             ++posflag;
 89         }
 90         node<T> *s=new node<T>;
 91         if (s==NULL)
 92             return false;
 93         s->data=e;
 94         s->next=s->prior=NULL;
 95         if (p==NULL||posflag>pos-1)
 96         {
 97             return false;
 98         }
 99         s->next=p->next;
100         if(p->next!=NULL)
101         p->next->prior=s;
102         p->next=s;
103         s->prior=p;
104         return true;
105     }
106
107     //删除第i个位置上的节点
108     bool deleteLink(int pos)
109     {
110         node<T> *p=head;
111         if (pos>length()||pos<1)
112         {
113             return false;
114         }
115         int posflag=0;
116         while(p && posflag<pos-1)
117         {
118             p=p->next;
119             ++posflag;
120         }
121         if (p && p->next==NULL)
122         {
123             p->prior->next=NULL;
124             delete p;
125             p=NULL;
126         }
127         else{
128             p->prior->next=p->next;
129             p->next->prior=p->prior;
130             delete p;
131             p=NULL;
132         }
133         return true;
134     }
135
136     //删除制定元素的节点
137     bool deleteLink(T e)
138     {
139         node<T> *p=head;
140         while (p)
141         {
142             if (p->data==e)
143             {
144                 break;
145             }
146             p=p->next;
147         }
148         if(p==NULL)
149         {
150             cout<<"can not find the elem:"<<e<<endl;
151             return false;
152         }
153         //判断要删除的是不是尾节点
154         if (p->next==NULL)
155         {
156             p->prior->next=NULL;
157             delete p;
158             p=NULL;
159         }
160         else{
161             p->prior->next=p->next;
162             p->prior=p->next->prior;
163             delete p;
164             p=NULL;
165         }
166         return true;
167     }
168 };

测试工作

 1 int main()
 2 {
 3     nLink<char> link;
 4     for (int i=0;i<10;i++)
 5     {
 6         link.appendLink('a'+i);
 7     }
 8     link.insertLink(11,'s');
 9     cout<<"Length:"<<link.length()<<endl;
10     link.printLink();
11     link.deleteLink('s');
12     link.printLink();
13     cout<<"Length:"<<link.length()<<endl;
14     system("pause");
15     return 0;
16 }

参考地址:http://www.oschina.net/code/snippet_250934_12063

数据结构--双链表的创建和操作相关推荐

  1. C语言数据结构篇——双链表的创建,插入,节点删除,打印等操作

    作者名:Demo不是emo  主页面链接:主页传送门 创作初心:对于计算机的学习者来说,初期的学习无疑是最迷茫和难以坚持的,中后期主要是经验和能力的提高,我也刚接触计算机1年,也在不断的探索,在CSD ...

  2. 数据结构-双链表基本操作(C语言实现)

    参考书:王道考研数据结构 (此贴为博主学习408的笔记,因博主也是学习者,个人总结如有错误欢迎指正.如有侵权请告知,马上删除致歉)​​ 一:双链表含义 双链表是在单链表的基础上增加了一个指向前驱结点的 ...

  3. 数据结构——双链表(C语言详述通用双链表)

    说明:   本文章旨在总结备份.方便以后查询,由于是个人总结,如有不对,欢迎指正:另外,内容大部分来自网络.书籍.和各类手册,如若侵权请告知,马上删帖致歉.   QQ 群 号:513683159 [相 ...

  4. Scratch 与C语言实现数据结构静态链表的建立及操作

    Scratch 实现数据结构静态链表的建立及操作 scratch操作 Scratch 实现数据结构静态链表的建立及操作 数据结构 初始化静态链表 添加数据代码 删除数据 回收空闲节点操作代码 计算静态 ...

  5. 数据结构单链表的创建以及简单操作

    在数据结构中: 目录 一.数据节点类型结构体封装 二.创建单链表 1.创建链表 2.头部插入 3.遍历链表 4.尾部插入 5.释放链表 链表可以解决顺序表无法开辟连续空间的问题,大大提高了内存的利用率 ...

  6. 天勤考研数据结构———双链表操作

    定义双链表的结构体类型 typedef struct DLNode{     int data;     struct DLNode *next;     struct DLNode *prior; ...

  7. (王道408考研数据结构)第二章线性表-第三节2:双链表的定义及其操作(插入和删除)

    文章目录 一:双链表的定义 二:双链表代码描述 三:双链表的初始化 四:双链表的插入 五:双链表的删除 一:双链表的定义 双链表:双链表在单链表的基础上再增加一个指针域,用于指向它的前驱结点 二:双链 ...

  8. C#数据结构-双链表

    据说单链表没有回路,那么双链表也出现了,既包括后继指针,又加入了前驱指针,某个元素可以寻找他上面一个元素,也可以寻找到下一个元素.当然双链表也是链表的一种. 物理存储结构:不一定是连续的存储区域 逻辑 ...

  9. 数据结构 - 双链表的头插法和后插法

    1.单链表的局限性 -> 单链表是对数组的一个扩展,解决了数组的大小比较死板不容易扩展的问题.使用堆内存来存储数据,将数据分散到各个节点之间,其各个节点在内存中可以不相连,节点之间通过指针进行单 ...

最新文章

  1. 几则与西门子相关的消息
  2. 你还有学了三年建模的朋友吗?他有救了
  3. 谈谈你对集成学习的见解与认识,描述一下它们的优势所在?
  4. 第2天:汇编语言与Makefile
  5. Java程序设计当中包的使用_【学习笔记】 唐大仕—Java程序设计 第4讲 类、包和接口之4.2 类的继承...
  6. Docker-Compose快速搭建Oracle-11G系统
  7. 由浅入深CAS,小白也能与BAT面试官对线
  8. 21天jmeter打卡 day1
  9. LVS调度算法权威讲解——官方文档翻译
  10. 电子设计推荐看的好书
  11. 第三届泰迪杯全国大学生数据挖掘竞赛通知
  12. SPI总线-物理层 协议层
  13. 速达pro服务器显示试用,速达v3-pro商业版突然变成试用版了,加密狗的灯不亮了,是什么原因- _0...
  14. php 表示每月一号,适合每月一号发的说说
  15. NVENC/NVDEC 10bits 编程
  16. SKY65723-81低噪声放大器前端模块 GPS / GNSS / BDS预过滤器
  17. CIO40: IT男之--佛系躺平
  18. OpenKylin 开源桌面操作系统安装
  19. MIKE 21 教程 0.1 软件介绍与教学目录
  20. 关于做PPT的一些总结

热门文章

  1. Vue使用axios无法读取data的解决办法
  2. smarty引擎之练习
  3. mysql 5.1由于Host为localhost的用户为空,密码为空,导致本地用户无法登陆。
  4. 十三、oracle 数据字典和动态性能视图
  5. myeclipse5.5注册码
  6. python控制台执行代码字符串_编写Python脚本以使用控制台命令执行
  7. 5.6.50 mysql 用什么驱动_日均5亿查询量的京东订单中心,为什么舍弃MySQL用ES?
  8. 计算机里有个不能进入的磁盘分区,新电脑只有一个分区怎么办? 教你们如何不进pe给硬盘创建新分区!...
  9. vue 固定div 滚动_vue.js-div滚动条隐藏但有滚动效果的实现方法
  10. 国际旅游管理专业跨专业考计算机,旅游管理考研我想跨专业考旅游管理专业的研究 – 手机爱问...