




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第C++实现双向链表代码分析目录前言:一、双向链表优缺点二、C++实现分析(1)节点类(2)链表类分析(3)链表类构造函数(4)isEmpty()判断是否为空(5)size()获取链表长度(6)getNode()获取节点(7)insert()插入节点(8)、remove()删除节点(9)traversal()遍历链表函数
前言:
前面文章分析了单向链表,并给出了python和C++实现:单链表从原理到实现,python和C++两个版本
本文介绍的双向链表是在单向链表基础上的一个改进,每个节点指向其直接前驱和直接后继节点。因此,从双向链表的任意位置开始,都能访问所有的节点。
一、双向链表优缺点
双向链表的缺点:
从节点的结构上可以看出,双向链表的所需的存储空间大于单向链表。同时,对于插入和删除等操作来说,双向链表的节点操作更加复杂,涉及到节点的前后两个节点。
双向链表的节点:
对于双向链表来说,它的每个节点要指向直接前驱和直接后继,所以节点类需要含有两个指针域。指向直接前驱的指针使用pre表示,指向后继的指针使用next表示。
二、C++实现分析
(1)节点类
双向链表的节点含有两个指针域,即直接前驱pre和直接后继next。节点类采用的是模板实现,这样其所存储的数据就不再依赖于特定类型。
templateclassT
classNode{
public:
Node(){}
Node*pre;
Node*next;
//由于data属性是私有的
//所以采用get和set对data进行处理
voidsetData(Tdata){this-data=data;}
TgetData(){returnthis-data;}
private:
Tdata;
};
(2)链表类分析
链表类应该包含基本的增、改、删、查等操作,由于其各种功能的实现是很相似的,
所以下面给出了需要实现的典型函数:
构造函数:isEmpty()判断是否为空;size()返回链表长度;insert()头插、尾插、中间插入节点;delete()删除节点;getNode()获取节点;traversal()遍历链表;
链表类的定义如下:
templateclassP
classDoubleLinkedList{
public:
DoubleLinkedList();
boolisEmpty();
NodeP
*getNode(intindex);
intsize();
voidinsert(intdata,intindex);
voidtraversal();
voidremove(intindex);
private:
NodeP*head;
};
(3)链表类构造函数
初始化时需要创建头节点,作为头指针:
templateclassP
DoubleLinkedListP::DoubleLinkedList(){
//创建头结点
head=newNodeP
head-pre=NULL;
head-next=NULL;
head-setData(666);
}
(4)isEmpty()判断是否为空
对于双向链表来说,判断是否为空只需要判断头指针是否指向其他Node节点:
templateclassP
boolDoubleLinkedListP::isEmpty(){
if(head-next==NULL){
returntrue;
}
else
{
returnfalse;
}
}
(5)size()获取链表长度
获取链表长度时需要判断链表是否为空,从而确定是否采用遍历的方式计算链表的长度。
由于采用的不是循环链表,所以循环的结束条件是判断是否指向空节点:
templateclassP
intDoubleLinkedListP::size(){
if(isEmpty()){
return0;
}
else{
intcount=0;
NodeP*current=head-next;
//循环结束条件
while(current!=NULL)
{
current=current-next;
count++;
}
returncount;
}
}
(6)getNode()获取节点
在插入和删除等操作中,需要频繁的进行节点获取操作。
所以应该封装为单独的函数用于节点获取,如下:
templateclassP
NodeP*DoubleLinkedListP::getNode(intindex){
NodeP*current=head;
intcurrentCount=0;
//循环结束条件
while(currentCount=index)
{
current=current-next;
currentCount++;
}
returncurrent;
}
(7)insert()插入节点
插入节点依旧包含头插法,尾插法和任意位置的插入。插入操作与单向链表的最大区别在于节点的指针移动较为复杂,需要将插入位置前后两个节点与新节点均建立联系:
templateclassP
voidDoubleLinkedListP::insert(intdata,intindex){
NodeP*node=newNodeP
node-setData(data);
//1、列表为空时
if(isEmpty()){
head-next=node;
node-pre=head;
return;
}
//2、头插法
if(index==0){
node-next=head-next;
head-next-pre=node;
node-pre=head;
head-next=node;
}
//3、尾插法
elseif(index=this-size()-1){
//printf("index%d,size%d\n",index,this-size());
NodeP*temp=this-getNode(this-size()-1);
temp-next=node;
node-pre=temp;
}
//4、任意位置插入
else
{
NodeP*pre=this-getNode(index);
NodeP*next=pre-next;
node-next=pre-next;
node-pre=pre;
pre-next=node;
node-next-pre=node;
}
}
(8)、remove()删除节点
前面已经定义了用于获取节点的getNode()函数,所以remove()函数只需要进行指针移动操作。
将所要删除的节点的直接前驱节点和直接后继节点相连:
templateclassP
voidDoubleLinkedListP::remove(intindex){
//保证索引有意义
if((index(this-size()-1))(index0)){
NodeP*node=this-getNode(index);
NodeP*pre=node-
NodeP*next=node-next;
pre-next=next;
next-pre=pre;
}
}
(9)traversal()遍历链表函数
虽然可以从双向链表的任一个节点开始遍历整个链表,但是下面的实现依旧是从头结点开始的,循环的结束依旧是指向空指针:
templateclassP
voidDoubleLinke
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 纺织行业投资趋势试题及答案
- 幼儿园母亲节活动主题
- 医学合同协议书
- 解密2024年助理广告师考试试题及答案
- 职员合同协议书
- 设计实践中的团队协作能力试题及答案
- 合同履行协议书
- 瓜苗购销合同协议书
- 合同演出协议书
- 合同协议书转让
- 梅毒诊疗指南(2023年)
- 高中物理3-3热学练习题(含答案)
- 白酒酿造工艺课件
- 关节镜技术在骨科的应用
- DB32-T 3916-2020建筑地基基础检测规程-(高清现行)
- 2022年执业医师证件租赁协议书
- 太上三官宝经(共12页)
- Q∕GDW 11445-2015 国家电网公司管理信息系统安全基线要求
- java考试管理系统源代码开题报告外文翻译英文文献计001
- 人教版九年级历史中考【政治经济专题复习课件44张】(共44张)
- T∕CSEA 6-2018 锌镍合金电镀技术条件
评论
0/150
提交评论