模板类—双向链表: doubly linked list

在循环链表中,从任意一个结点除法可以扫描到其他结点,但要找到其前序结点,则需要遍历整个循环链表。

双向链表

在单链表的基础上设置一个指向其前驱结点的指针域,这样就形成了双链表

  1. 其中data为数据域
  2. pre为前驱指针域,存放该结点的前驱结点地址
  3. next为后继指针域,存放该结点后继结点的地址

顺序表和链表的比较

  1. 元素的随机访问:顺序表>链表
  2. 元素的插入和删除:链表>顺序表
  3. 顺序表需要提前分配空间
  4. 链表不需要提前分配空间-只要能够向内存中申请就可以

双链表的声明

//
// Created by HANWENKE on 2022/8/27.
//#ifndef DOUBLY_LINKED_LIST_DOUBLY_LINKED_LIST_H
#define DOUBLY_LINKED_LIST_DOUBLY_LINKED_LIST_H#endif //DOUBLY_LINKED_LIST_DOUBLY_LINKED_LIST_H
#include <iostream>
#include <vector>
#include <random>
using  namespace  std;
template <class  _Ty>
struct Node{_Ty data;Node<_Ty> *next;Node<_Ty> *pre;
};
template <class _Ty>
class Doubly_Linked_List{private:Node<_Ty> *head;//链表的头指针
public:Doubly_Linked_List();//无参构造Doubly_Linked_List(const _Ty *const &a, int n);//有参构造,建立有n个元素的单链表~Doubly_Linked_List();//析构函数int length();//求单链表的长度Node<_Ty>* Get(int t);//按位置查找,在双链表中查找第i个结点int Locate(const _Ty &x);//按值查找。在单链表中查找值为x的元素序号void Insert(int i,const _Ty &x);//插入操作,在第i个位置后插入元素值为x的结点void Delete(int i);//删除单链表中第i个结点void Print();//遍历操作,按序号输出各个元素
};

双向链表的实现

//
// Created by HANWENKE on 2022/8/27.
//#include "doubly_linked_list.h"template<class _Ty>
Doubly_Linked_List<_Ty>::Doubly_Linked_List() {head=new Node<_Ty>;head->next= nullptr;head->pre= nullptr;
}template<class _Ty>
//双向链表--头插有参构造
Doubly_Linked_List<_Ty>::Doubly_Linked_List( const _Ty *const &a, int n) {head=new Node<_Ty>;head->next= nullptr;head->pre= nullptr;for(int i=0;i<n;i++){if(head->next== nullptr){auto *s=new Node<_Ty>;s->data=a[i];s->pre=head;s->next=head->next;head->next=s;}else{auto *s=new Node<_Ty>;s->data=a[i];s->pre=head;s->next=head->next;head->next->pre=s;head->next=s;}}
}template<class _Ty>
Doubly_Linked_List<_Ty>::~Doubly_Linked_List() {Node<_Ty> *p=head->next;Node<_Ty> *q=p;while(p){q=p->next;delete p;p=q->next;}delete head;p= nullptr;q= nullptr;head= nullptr;
}template<class _Ty>
int Doubly_Linked_List<_Ty>::length() {Node<_Ty> *p;p=head->next;int count=0;while (p){++count;p=p->next;}return count;
}
template<class _Ty>
//按位置查找
Node<_Ty>* Doubly_Linked_List<_Ty>::Get(int t) {Node<_Ty> *p=head->next;int count=1;while(p&&count<t){p=p->next;count++;}if (p == nullptr){cout<<"位置异常"<<endl;return nullptr;}elsereturn p;}
//按值查找--如果找到返回元素的序号,如果查找不成功返回0表示失败
template<class _Ty>
int Doubly_Linked_List<_Ty>::Locate(const _Ty &x) {Node<_Ty> *p=head->next;int count=1;while(p){if(p->data==x) return count;p=p->next;count++;}return 0;
}template<class _Ty>
void Doubly_Linked_List<_Ty>::Insert(int i, const _Ty &x) {Node<_Ty> *temp= Get(i);auto *newNode=new Node<_Ty>;newNode->data=x;newNode->pre=temp;newNode->next=temp->next;temp->next->pre=newNode;temp->next=newNode;}template<class _Ty>
void  Doubly_Linked_List<_Ty>::Delete(int i) {if(i<0||i>length()){cout<<"删除位置不合法"<<endl;return;}auto temp= Get(i);temp->pre->next=temp->next;temp->next->pre=temp->pre;delete temp;temp= nullptr;
}template<class _Ty>
/*遍历操作:* 临时结点指向第一个结点* 重复执行以下操作,直到p为空:*  输出结点p的数据域*  指针后移*/
void Doubly_Linked_List<_Ty>::Print() {Node<_Ty> *p=head->next;while(p!= nullptr){cout<<p->data<<"  ";p=p->next;}cout<<endl;
}
int main(){vector<char>res(20);for (int i = 0; i < res.size(); i++)res[i]=i+'A';Doubly_Linked_List<char> l(&res[0],res.size());l.Print();cout<<l.length()<<endl;//cout<<l.Get(100)->data<<endl;l.Insert(0,'W');l.Print();l.Delete(3);l.Print();return 0;
}

C++ 模板实现—双向链表: doubly linked list相关推荐

  1. 双向链表(Doubly Linked List)

    双向链表(Doubly Linked List) 1. 双向链表的概念 1.1 双向链表的定义 双向链表又称为双链表,是链表的一种. 1.2 双向链表的结点结构 双向链表的结点包括三个部分:前驱指针域 ...

  2. C语言实现双向链表Doubly Linked List(附完整源码)

    双向链表Doubly Linked List list结构体 实现以下6个接口 双向链表Doubly Linked List完整源码(定义,实现,main函数测试) list结构体 typedef s ...

  3. C++Doubly Linked List双向链表(附完整源码)

    C++AVL树自平衡二叉查找树 node结构体定义 实现了以下几个接口 Doubly Linked List双向链表算法的完整源码(定义,实现,main函数测试) node结构体定义 struct n ...

  4. LeetCode 426. Convert Binary Search Tree to Sorted Doubly Linked List--转换二叉树为双向链表--Java,C++,Python解法

    题目地址:Convert Binary Search Tree to Sorted Doubly Linked List - LeetCode Convert a BST to a sorted ci ...

  5. LeetCode 430. Flatten a Multilevel Doubly Linked List

    原题链接在这里:https://leetcode.com/problems/flatten-a-multilevel-doubly-linked-list/description/ 题目: You a ...

  6. C#,双向链表(Doubly Linked List)快速排序(Quick Sort)算法与源代码

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

  7. 430. Flatten a Multilevel Doubly Linked List | 430. 扁平化多级双向链表(DFS)

    题目 https://leetcode.com/problems/flatten-a-multilevel-doubly-linked-list/ 题解 思路不难,DFS. 指针操作比较坑,注意边界以 ...

  8. LeetCode Flatten a Multilevel Doubly Linked List(dfs)

    问题: 多级双向链表中,除了指向下一个节点和前一个节点指针之外,它还有一个子链表指针,可能指向单独的双向链表.这些子列表也可能会有一个或多个自己的子项,依此类推,生成多级数据结构,如下面的示例所示. ...

  9. Doubly Linked List,( Aizu - ALDS1_3C )

    题目链接 : https://vjudge.net/problem/Aizu-ALDS1_3_C 注 :双向链表 1 #include<stdio.h> 2 #include<std ...

  10. 【ACM】Doubly Linked List(STL list)

    题目链接:https://vjudge.net/problem/Aizu-ALDS1_3_C 这一题一开始的时候想的是用vector,超时 #include <iostream> #inc ...

最新文章

  1. 图像处理:像素间的基本关系
  2. 语言inc c,汇编语言练习
  3. 好的 Web 前端年薪会有多少?
  4. 【note】编程范式(编程范型)的含义和种类,多范式编程语言
  5. php validator classes
  6. Springboot thymeleaf i18n国际化多语言选择-2.业务流程内部返回 对应的语言
  7. Java 学习笔记(手写版)
  8. 简单循迹小车实验心得_智能小车实验报告
  9. C语言:表白(多彩小心心)
  10. iOS 限制输入框的字符长度
  11. java 去除时间中的PM_在Java中使用SimpleDateFormat(“ a”)显示AM / PM时间标记
  12. Spring Boot源码简析 @EnableTransactionManagement
  13. 短期python培训机构
  14. (三)计算机视觉 --SIFT特征匹配、地理标记图像匹配及RANSAC图像拼接
  15. termux目录_手机学编程(2)目录管理命令
  16. CSP-J CSP-S 初赛模拟题
  17. jupyter notebook如何显示行号?
  18. ubuntu16.04基于eclipse搭建px4编译环境+Jlink调式
  19. # **从GIS到桌面出版 ——基于Adobe Illustrator+MAPublisher的空间数据库制图技术路线浅淡*
  20. Java多态(简单介绍)

热门文章

  1. 学术英语阅读与写作3:introduction引言
  2. 聊聊深度学习这档子事(3):寻找万能的通用模型
  3. ICE 3.7.4 实现客户服务端hello world
  4. 解决IPOD NANO7无法开机
  5. 126邮箱国外服务器,OUTLOOK连126邮箱能不能向国外新闻组投递邮件?哪些邮箱服务器可以?...
  6. 设计专业是计算机的吗,计算机平面设计是属于计算机什么专业范畴?
  7. 没有apihost什么意思_热文:2021年没有立春什么意思
  8. MongoDB windows 局域网连接
  9. C 中用语言描述出下述方法的功能,2015年10月自考《大学语文》模拟试题及答案4...
  10. C语言中runtime错误,runtime error错误解决方案 打开软件出现runtime error