【实现类】

template <class T>
struct Node{//结点T data;//数据域Node *llink;//左指针Node *rlink;//右指针
};template <class T>
class doubleList{
private:Node<T> *first;//头指针
public:doubleList();//无参构造函数doubleList();//有参构造函数~doubleList();//析构函数void insertElement(T x);//在双链表中插入值为x的元素T deleteElement(T x);//删除双链表中值为x的元素void Sort(int len);//冒泡排序void print();//按序号依次输出双链表各元素
};

【构造函数】

1.无参构造函数

对于无参构造函数,只需建一个头结点,令其左右指针分别为空即可

template <class T>
linkList<T>::doubleLink(){//无参构造函数first=new Node<T>;//头指针指向头结点first->llink=NULL;//左指针为空first->rlink=NULL;//右指针为空
}

2.有参构造函数

1)头插法

template <class T>
linkList<T>::doubleLink(T a[],int n){first=new Node;//头指针指向头结点first->llink=NULL;//左指针为空first->rlink=NULL;//右指针为空Node *s;//新结点for(int i=1;i<=n;i++){s=new Node;s->data=a[i];//数据域s->rlink=first->rlink;first->rlink=s;s->llink=first;if(s->rlink!=NULL)//下个结点不为空s->rlink->llink=s;//下一个节点指向自己}
}

2)尾插法

template <class T>
linkList<T>::doubleLink(T a[],int n){first=new Node<T>;//头指针指向头结点Node *r=first;//尾指针first->llink=NULL;//左指针为空first->rlink=NULL;//右指针为空Node<T> *s;//新结点for(int i=0;i<n;i++){s=new Node<T>;s->data=a[i];//数据域r->rlink=s;s->llink=r;r=s;}r->rlink=NULL;
}

【析构函数】

对于析构函数,与单链表的析构函数相同,仅需使用右指针 rlink 不断指向下一结点,释放存储空间即可

template <class T>
doubleLink<T>::~doubleLink(){Node<T> *p,*q;//工作指针p=first;//从头开始while(p!=NULL){q=p->rlink;//指向下一结点delete p;//释放当前结点空间p=q;//令当前节点指向下一结点}
}

【插入】

在双向链表中插入一个结点,对指针的操作顺序有很多,但由于双向链表实质上可看作两条反向的单链表,所以插入操作的核心是:先处理每个方向的远端指针,再处理近端指针

原则上,插入一个结点需要连接 4 个指针,但考虑插入时的特殊情况,即在空表或表尾插入一个结点时,新结点的右指针指向为空,此时只需连接 3 个指针

void doubleList<T>:: insertElement(T x){//在双表中插入值为x的元素Node<T> *s=new Node<T>;//新结点s->data=x;//新结点数据域赋值为xs->rlink=p->rlink;//新结点s的右指针指向工作结点p之后的结点s->llink=p;//新结点s的左指针指向工作结点pp->rlink=s;//工作结点p的右指针指向新结点sif(s->rlink!=NULL)//不为表尾或空时s->rlink->llink=s;//新结点s的右指针的左指针指向新结点s
}

【删除】

对于删除操作,其与插入操作相似,在删除时需要判断是否为表尾结点

bool doubleList<T>::deleteElement(T x){//删除双链表中值为x的元素Node<T> *p;//工作指针p=first->rlink;while(p!=NULL){if(p->data==x){if(p->rlink==NULL)//p为表尾元素p->llink->rlink=NULL;else{//p不为表尾元素p->llink->rlink=p->rlink;p->rlink->llink=p->llink;}delete p;//释放空间return true;//删除成功}p=p->rlink;}return false;//删除失败
}

【冒泡排序】

int doubleList<T>::void Sort(int len){//冒泡排序Node<T> *p;//工作指针for(int i=0;i<len-1;i++){//len-1轮p=first->rlink;for(int j=0;j<len-i-1;j++){//len-i次T tempA=p->data;//当前数据T tempB=p->rlink->data;//下一结点数据if(tempA>tempB){//比较T temp=p->data;p->data=p->rlink->data;p->rlink->data=temp;}p=p->rlink;//指向下一结点}}
}

【输出】

双链表的遍历输出,与单链表相同,仅需使用右指针 rlink 不断指向下一结点,输出数据域即可

template <class T>
void doubleLink<T>::print(){Node<T> *p;//工作指针p=first->rlink;//从第一个结点开始while(p!=NULL){cout<<(p->data)<<endl;//输出数据域p=p->rlink;//指向下一结点}
}

理论基础 —— 线性表 —— 双向链表相关推荐

  1. 理论基础 —— 线性表

    [逻辑结构] 线性表是零或多个数据元素组成的有限序列,其中,数据元素的个数定义为线性表的长度,当长度为 0 时称为空表,反之称为非空表. 一个非空表常记为:,其中 ai 是表中的第 i 个数据元素,表 ...

  2. 理论基础 —— 线性表 —— 单链表

    [实现类] 单链表的基本思想就是用指针表示结点之间的逻辑关系,因此要正确的对指针变量.指针.指针所指结点.结点的值进行区分. 设 p 是一个指针变量,则 p 的值是一个指针,若指针 p 指向某个 No ...

  3. 2021-9-下旬 数据结构-线性表-双向链表-java代码实现(复习用)

    public class DoubleLinkedListZH<E> {//调用方法参数是index的记得检测是否在合法范围(0~size-1)内,可以写一个arrangeCheck函数, ...

  4. 理论基础 —— 线性表 —— 循环链表

    [概述] 循环链表的构建与单链表十分相似,唯一不同的是,对于链表的表尾,需要将原来的 NULL 改为 first 以下仅给出构造函数的实现 [构造函数] 1.无参构造函数 生成一个头结点,让头指针指向 ...

  5. 理论基础 —— 线性表 —— 顺序表

    [实现类] const int maxSize=100;//存储空间初始分配量 template <class T> class SeqList{ private:T data[maxSi ...

  6. 【数据结构与算法】之线性表的应用和操作

    数据结构概念 数据结构:是相互之间存在一种或多种特定关系的数据元素的集合. 数据结构的逻辑结构:数据对象中数据元素之间的相互关系,分为线性结构.树形结构.图形结构以及集合结构. 数据结构的物理结构:数 ...

  7. 数据结构——线性表:顺序表、单向链表、循环链表、双向链表

    线性表   是一种数据结构:n个数据元素的有限序列 表示形式: L = (a1,a2...an) a1是线性表的元素,小写. n=0时候为空表 数据元素具有相同特性 相邻元素之间存在序偶关系:即有唯一 ...

  8. 线性表的Java实现--链式存储(双向链表)

    有了单向链表的基础,双向链表的实现就容易多了. 双向链表的一般情况: 增加节点: 删除节点: 双向链表的Java实现: package com.liuhao.algorithm; public cla ...

  9. 线性链表java实现_线性表的Java实现--链式存储(双向链表)

    线性表的Java实现--链式存储(双向链表) 有了单向链表的基础,双向链表的实现就容易多了. ? 双向链表的一般情况: ? ? class="decoded" alt=" ...

最新文章

  1. ORBBuf : 一种鲁棒的视觉SLAM缓冲方法
  2. 适配器模式(三种)简单使用
  3. 设计模式——代理模式
  4. redis单线程为什么快?
  5. SAP Spartacus 电商云 UI Shipping Method 在单元测试环境下没有显示的问题
  6. jQuery.理解选取更新范围
  7. 《天天数学》连载25:一月二十五日
  8. java线程本地存储_[并发并行]_[C/C++]_[使用线程本地存储Thread Local Storage(TLS)-win32和pthread比较]...
  9. 摄影平铺海报psd模板|简单搭建层次场景海报
  10. I/O Permission Bit Map in Task State Segment(TSS)
  11. numpy 删除元素
  12. 多个notification引发的问题
  13. 158. class, static, self, parent
  14. 浏览器HTML5 写入文件
  15. python实现汉诺塔递归算法超详细过程
  16. C语言多种格式输入乘法表,C语言:九九乘法表打印
  17. iOS语音转文字实现
  18. 干货!面向多源数据融合的睡眠时序分类方法研究
  19. 用计算机如何计算投资回收期,动态投资回收期怎么算的?
  20. 解决open()不能打开带中文的文件路径

热门文章

  1. 如何解决 IDEA 占用大量 CPU 导致的卡顿问题?这顿操作猛如虎
  2. IntelliJ IDEA 从入门到上瘾教程,2019图文版!
  3. PaaS中OpenShift持久化存储的管理实践
  4. 京东面试官:你是怎么理解 MySQL 的优化原理的?
  5. 找CTO杜仲:技术人别把股权(期权)弄成一张废纸(新书推荐)
  6. 数据中台建设五步法(文末赠书)
  7. 【JEECG_3.7.1】列表多表头的设计
  8. JEECG 商业版本最近新增什么功能啦?
  9. Python GUI
  10. throws与throw有什么关系?区别是什么?