双向循环链表的C++实现
使用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++实现相关推荐
- 数据结构与算法(2-2)线性表之链式存储(单链表、静态链表、循环链表、双向循环链表)
目录 一.单链表 1.存储方式 2.插入 3.删除 总代码: 二.静态链表 1.存储方式 2.插入 3.删除 4.遍历 总代码: 三.循环链表 总代码: 四.双向循环链表 1.存储方式: 2.插入和删 ...
- 链表 -- 双向循环链表(线性表)
1,双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱.所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点.一般我们都构造双向循环 ...
- C++实现有哨兵的双向循环链表
C++实现有哨兵的双向循环链表: #include<iostream> #include<stack> using namespace std; template<cla ...
- 数据结构 -- 双向循环链表
这篇文章写的是双向循环链表,这也是个非常经典的数据结构,我们在看 Linux 内核代码时就经常会遇到它.比如,在Linux的内核中实现进程描述符,使用的就是双向循环链表,因为它使用起来很方便,每个节点 ...
- 用动态数组模拟双向循环链表
简单来说其实使用数组模拟LinkedList.同LinkedList的操作基本相似. 基本原理为:数组存放Entry对象,包含数据部分,指针部分(数组下标) 添加,删除基本操作改变指针.数组包含两 ...
- java与数据结构(4)---java实现双向循环链表
线性表之链式存储结构双向循环链表 双向循环链表:每个结点包含了数据.直接前驱地址指针和直接后驱地址指针,头结点的直接前驱指向尾结点,尾结点的直接后驱指向头结点,头尾相连构成一个可正可反的圆环.可以形象 ...
- 数据结构-单向循环链表、双向循环链表、仿真链表
一.单向循环链表: 1.概念: 单向循环链表是单链表的另一种形式,其结构特点是链表中最后一个结点的指针不再是结束标记,而是指向整个链表的第一个结点,从而使单链表形成一个环. 和单链表相比,循环单链表的 ...
- Python创建一个循环链表、双向循环链表
循环链表与双向循环链表 循环链表 循环链表相较于单链表,将末尾结点的连接域指向了头结点,就类似于将播放器的顺序播放改成了列表循环 双向循环链表 双向链表相较于之前的链表多了上一节点连接域,在双向链表中 ...
- c++17(20)-双向循环链表(不依赖具体数据)
双向循环链表(不依赖具体数据),借鉴LINUX内核的链表结构 #include <iostream> using namespace std; struct stdlist{stdlist ...
- step3 . day3 数据结构之线性表 单项循环链表和双向循环链表
1. 使用单项循环链表解决约瑟夫问题: #include <stdio.h> #include <stdlib.h> typedef struct looplist{ int ...
最新文章
- [转载]秀脱linux实战笔记linux-kernel-3.0.3实战篇
- 排队两小时买墨茉、虎头局,但别指望年轻人“味蕾忠诚”
- angular4 表单
- 扶凯:海量视频和用户时代的CDN
- java基础之线程(1)
- calc BZOJ 2655
- java 反编译 行号对齐 decompiler如何去掉行号
- x86保护模式 任务状态段和控制门
- 555定时器的应用——单稳态触发器
- 《指针的编程艺术(第二版)》一第三章 指针与数组3.1 指针与一维数组
- Oracle书籍推荐MySQL书籍推荐
- 邀请别人进入队伍rust,rust邀请进队 | 手游网游页游攻略大全
- 客户关系管理(CRM)基础篇
- ENSP下载还有其他资料地址
- 经济机器是如何运行的(观后感)
- Visio 常用的快捷键
- 连接方法:网线水晶头接法
- android源代码在线查看
- 高防服务器防御阈值买多大合适呢?
- 人力资源数据分析(python)
热门文章
- 面对面的办公室——纪念艾伦•图灵百年诞辰
- java毕业设计——基于java+JSP+MySQL的网上订餐管理系统设计与实现(毕业论文+程序源码)——网上订餐管理系统
- 爬取mzi.com妹子图片网站(requests库)
- 最全人工智能专业术语表(中英文对照)
- mac访问服务器文件有把锁,mac文件被锁定怎么解决 mac解除文件锁定
- 汉仪南宫体简 字体如何卸载删除?
- androidtv gms包_Android 9,8.1和8.0的GMS包更新 201812
- 模型预测控制与机器学习
- 计算机学院实验室安全管理办法,计算机学院实验室安全管理办法.pdf
- 本地数据库数据导入linux