使用C++实现了一个双向循环链表,来看代码:

#pragma once
#include "assert.h"struct Node
{Node(int val) :m_val(val) {}Node() { }int   m_val;            //数据Node* m_prev = nullptr; //前驱结点的地址Node* m_next = nullptr; //后继结点的地址
};class CIterator
{public:CIterator(Node *pCur = nullptr) : m_pCur(pCur) {}CIterator(const CIterator &) = default;CIterator(CIterator &&) = default;CIterator &operator=(const CIterator &) = default;~CIterator() = default;int &operator*(){return(m_pCur->m_val);}// 前置++CIterator& operator++(){if (m_pCur->m_next != nullptr){m_pCur = m_pCur->m_next;return(*this);}}// 后置++CIterator operator++(int){assert(m_pCur->m_next != nullptr);m_pCur = m_pCur->m_next;return(CIterator(m_pCur->m_prev));}// 前--CIterator &operator--(){assert(m_pCur->m_prev->m_prev);m_pCur = m_pCur->m_prev;return(*this);}// 后--CIterator operator--(int){assert(m_pCur->m_prev->m_prev);m_pCur = m_pCur->m_prev;return(m_pCur->m_next);}bool operator==(const CIterator &itr){return(m_pCur != itr.m_pCur);}bool operator!=(const CIterator &itr){return(!(m_pCur == itr.m_pCur));}Node *operator->(){return(m_pCur);}
private:Node *m_pCur;
};class CList
{public:static const size_t INVALID_IDX = -1;
public:// 默认构造函数CList();// 拷贝构造函数CList(const CList& lst);// 移动构造函数CList(CList&& lst);// 析构函数virtual ~CList();// 等号赋值运算符CList& operator=(const CList& lst);// 不需要移动等号运算符重载CList& operator=(CList&& lst) = delete;// 重载[]运算符int& operator[](size_t nIdx);// 新结点插入头部CList& InsertHead(int val);// 新结点插入尾部CList& InsertTail(int val);// 在指定索引插入值CList& Insert(int val, size_t nIdx); // 遍历打印双向链表void TraverseList() const;// 删除双向链表头部CList& DeleteHead();// 删除双向链表尾部CList& DeleteTail();// 删除指定索引指向的结点CList& Delete(size_t nIdx);           // 清空链表并释放空间void   Clear();// 通过值来寻找对应结点的索引//int    Find(int val) const; CIterator Find(int val);// 获取链表元素数量size_t Size() const;// 判断链表是否为空bool   IsEmpty() const;CIterator Begin();CIterator End();
private:// 通过索引获取执行结点的指针Node* IdxToNode(size_t nIdx);// 初始化双向链表void InitList();
private:Node* m_pHeadGuard = nullptr; // 头哨兵Node* m_pTailGuard = nullptr; // 尾哨兵size_t m_nSize = 0;           // 个数
};

(完)

双向循环链表的C++实现相关推荐

  1. 数据结构与算法(2-2)线性表之链式存储(单链表、静态链表、循环链表、双向循环链表)

    目录 一.单链表 1.存储方式 2.插入 3.删除 总代码: 二.静态链表 1.存储方式 2.插入 3.删除 4.遍历 总代码: 三.循环链表 总代码: 四.双向循环链表 1.存储方式: 2.插入和删 ...

  2. 链表 -- 双向循环链表(线性表)

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

  3. C++实现有哨兵的双向循环链表

    C++实现有哨兵的双向循环链表: #include<iostream> #include<stack> using namespace std; template<cla ...

  4. 数据结构 -- 双向循环链表

    这篇文章写的是双向循环链表,这也是个非常经典的数据结构,我们在看 Linux 内核代码时就经常会遇到它.比如,在Linux的内核中实现进程描述符,使用的就是双向循环链表,因为它使用起来很方便,每个节点 ...

  5. 用动态数组模拟双向循环链表

    简单来说其实使用数组模拟LinkedList.同LinkedList的操作基本相似.  基本原理为:数组存放Entry对象,包含数据部分,指针部分(数组下标)  添加,删除基本操作改变指针.数组包含两 ...

  6. java与数据结构(4)---java实现双向循环链表

    线性表之链式存储结构双向循环链表 双向循环链表:每个结点包含了数据.直接前驱地址指针和直接后驱地址指针,头结点的直接前驱指向尾结点,尾结点的直接后驱指向头结点,头尾相连构成一个可正可反的圆环.可以形象 ...

  7. 数据结构-单向循环链表、双向循环链表、仿真链表

    一.单向循环链表: 1.概念: 单向循环链表是单链表的另一种形式,其结构特点是链表中最后一个结点的指针不再是结束标记,而是指向整个链表的第一个结点,从而使单链表形成一个环. 和单链表相比,循环单链表的 ...

  8. Python创建一个循环链表、双向循环链表

    循环链表与双向循环链表 循环链表 循环链表相较于单链表,将末尾结点的连接域指向了头结点,就类似于将播放器的顺序播放改成了列表循环 双向循环链表 双向链表相较于之前的链表多了上一节点连接域,在双向链表中 ...

  9. c++17(20)-双向循环链表(不依赖具体数据)

    双向循环链表(不依赖具体数据),借鉴LINUX内核的链表结构 #include <iostream> using namespace std; struct stdlist{stdlist ...

  10. step3 . day3 数据结构之线性表 单项循环链表和双向循环链表

    1. 使用单项循环链表解决约瑟夫问题: #include <stdio.h> #include <stdlib.h> typedef struct looplist{ int ...

最新文章

  1. [转载]秀脱linux实战笔记linux-kernel-3.0.3实战篇
  2. 排队两小时买墨茉、虎头局,但别指望年轻人“味蕾忠诚”
  3. angular4 表单
  4. 扶凯:海量视频和用户时代的CDN
  5. java基础之线程(1)
  6. calc BZOJ 2655
  7. java 反编译 行号对齐 decompiler如何去掉行号
  8. x86保护模式 任务状态段和控制门
  9. 555定时器的应用——单稳态触发器
  10. 《指针的编程艺术(第二版)》一第三章 指针与数组3.1 指针与一维数组
  11. Oracle书籍推荐MySQL书籍推荐
  12. 邀请别人进入队伍rust,rust邀请进队 | 手游网游页游攻略大全
  13. 客户关系管理(CRM)基础篇
  14. ENSP下载还有其他资料地址
  15. 经济机器是如何运行的(观后感)
  16. Visio 常用的快捷键
  17. 连接方法:网线水晶头接法
  18. android源代码在线查看
  19. 高防服务器防御阈值买多大合适呢?
  20. 人力资源数据分析(python)

热门文章

  1. 面对面的办公室——纪念艾伦•图灵百年诞辰
  2. java毕业设计——基于java+JSP+MySQL的网上订餐管理系统设计与实现(毕业论文+程序源码)——网上订餐管理系统
  3. 爬取mzi.com妹子图片网站(requests库)
  4. 最全人工智能专业术语表(中英文对照)
  5. mac访问服务器文件有把锁,mac文件被锁定怎么解决 mac解除文件锁定
  6. 汉仪南宫体简 字体如何卸载删除?
  7. androidtv gms包_Android 9,8.1和8.0的GMS包更新 201812
  8. 模型预测控制与机器学习
  9. 计算机学院实验室安全管理办法,计算机学院实验室安全管理办法.pdf
  10. 本地数据库数据导入linux