数据结构--双链表的创建和操作
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 };
二、双向链表的实现
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
数据结构--双链表的创建和操作相关推荐
- C语言数据结构篇——双链表的创建,插入,节点删除,打印等操作
作者名:Demo不是emo 主页面链接:主页传送门 创作初心:对于计算机的学习者来说,初期的学习无疑是最迷茫和难以坚持的,中后期主要是经验和能力的提高,我也刚接触计算机1年,也在不断的探索,在CSD ...
- 数据结构-双链表基本操作(C语言实现)
参考书:王道考研数据结构 (此贴为博主学习408的笔记,因博主也是学习者,个人总结如有错误欢迎指正.如有侵权请告知,马上删除致歉) 一:双链表含义 双链表是在单链表的基础上增加了一个指向前驱结点的 ...
- 数据结构——双链表(C语言详述通用双链表)
说明: 本文章旨在总结备份.方便以后查询,由于是个人总结,如有不对,欢迎指正:另外,内容大部分来自网络.书籍.和各类手册,如若侵权请告知,马上删帖致歉. QQ 群 号:513683159 [相 ...
- Scratch 与C语言实现数据结构静态链表的建立及操作
Scratch 实现数据结构静态链表的建立及操作 scratch操作 Scratch 实现数据结构静态链表的建立及操作 数据结构 初始化静态链表 添加数据代码 删除数据 回收空闲节点操作代码 计算静态 ...
- 数据结构单链表的创建以及简单操作
在数据结构中: 目录 一.数据节点类型结构体封装 二.创建单链表 1.创建链表 2.头部插入 3.遍历链表 4.尾部插入 5.释放链表 链表可以解决顺序表无法开辟连续空间的问题,大大提高了内存的利用率 ...
- 天勤考研数据结构———双链表操作
定义双链表的结构体类型 typedef struct DLNode{ int data; struct DLNode *next; struct DLNode *prior; ...
- (王道408考研数据结构)第二章线性表-第三节2:双链表的定义及其操作(插入和删除)
文章目录 一:双链表的定义 二:双链表代码描述 三:双链表的初始化 四:双链表的插入 五:双链表的删除 一:双链表的定义 双链表:双链表在单链表的基础上再增加一个指针域,用于指向它的前驱结点 二:双链 ...
- C#数据结构-双链表
据说单链表没有回路,那么双链表也出现了,既包括后继指针,又加入了前驱指针,某个元素可以寻找他上面一个元素,也可以寻找到下一个元素.当然双链表也是链表的一种. 物理存储结构:不一定是连续的存储区域 逻辑 ...
- 数据结构 - 双链表的头插法和后插法
1.单链表的局限性 -> 单链表是对数组的一个扩展,解决了数组的大小比较死板不容易扩展的问题.使用堆内存来存储数据,将数据分散到各个节点之间,其各个节点在内存中可以不相连,节点之间通过指针进行单 ...
最新文章
- 几则与西门子相关的消息
- 你还有学了三年建模的朋友吗?他有救了
- 谈谈你对集成学习的见解与认识,描述一下它们的优势所在?
- 第2天:汇编语言与Makefile
- Java程序设计当中包的使用_【学习笔记】 唐大仕—Java程序设计 第4讲 类、包和接口之4.2 类的继承...
- Docker-Compose快速搭建Oracle-11G系统
- 由浅入深CAS,小白也能与BAT面试官对线
- 21天jmeter打卡 day1
- LVS调度算法权威讲解——官方文档翻译
- 电子设计推荐看的好书
- 第三届泰迪杯全国大学生数据挖掘竞赛通知
- SPI总线-物理层 协议层
- 速达pro服务器显示试用,速达v3-pro商业版突然变成试用版了,加密狗的灯不亮了,是什么原因- _0...
- php 表示每月一号,适合每月一号发的说说
- NVENC/NVDEC 10bits 编程
- SKY65723-81低噪声放大器前端模块 GPS / GNSS / BDS预过滤器
- CIO40: IT男之--佛系躺平
- OpenKylin 开源桌面操作系统安装
- MIKE 21 教程 0.1 软件介绍与教学目录
- 关于做PPT的一些总结
热门文章
- Vue使用axios无法读取data的解决办法
- smarty引擎之练习
- mysql 5.1由于Host为localhost的用户为空,密码为空,导致本地用户无法登陆。
- 十三、oracle 数据字典和动态性能视图
- myeclipse5.5注册码
- python控制台执行代码字符串_编写Python脚本以使用控制台命令执行
- 5.6.50 mysql 用什么驱动_日均5亿查询量的京东订单中心,为什么舍弃MySQL用ES?
- 计算机里有个不能进入的磁盘分区,新电脑只有一个分区怎么办? 教你们如何不进pe给硬盘创建新分区!...
- vue 固定div 滚动_vue.js-div滚动条隐藏但有滚动效果的实现方法
- 国际旅游管理专业跨专业考计算机,旅游管理考研我想跨专业考旅游管理专业的研究 – 手机爱问...