当前位置: 首页 > news >正文

C++ 双向循环链表

c++中双向循环链表的第一部分是数据域,用于存储具体的数据信息,这个数据可以是任何类型,取决于具体的应用场景。第二部分是指向前驱节点的指针prev,第三部分是指向后继节点的指针next,同样和prev一样是一个引用或指针。

双向循环链表:头插法,先创建一个节点,将节点的prev指向虚拟头结点,将节点的next指向虚拟头结点的下一个节点,最后将对应节点的指针指向对应位置。

尾插法,先创建一个节点,将节点的prev指向虚拟头结点的prev所指向的指针,将节点的next指针指向虚拟头结点,最后将对应节点的指针指向对应位置。

任意插,找到需要插入的指针后,新节点的prev指向插入节点位置的节点,新节点next指向插入节点位置的下一个节点,最后将节点的指针分别指向对应位置。

节点删除,将节点的前一个节点的next指针指向后一个节点,将后一个节点的prev指向节点前一个节点。并且释放节点的内存。注意,删除的节点不能是虚拟头结点。

代码见下:

#include<iostream>
using namespace std;//双向循环链表
template<typename T>
struct Node {T data;Node* prev;Node* next;Node(const T& value) :data(value), prev(NULL), next(NULL) {}
};template<class T>
class DoublyLinkedList {
public:DoublyLinkedList();~DoublyLinkedList();void push_front(const T& value);void push_back(const T& value);void insert_after(Node<T>* node, const T& value);void delete_node(Node<T>* node);void modify(Node<T>* node, const T& value);Node<T>* find(const T& value) const;void print() const;int size() const;bool empty() const;private:Node<T>* m_dummyHead;int m_size;
};template<class T>
DoublyLinkedList<T>::DoublyLinkedList(): m_size(0)
{m_dummyHead = new Node<T>(T());m_dummyHead->prev = m_dummyHead;m_dummyHead->next = m_dummyHead;
}template<class T>
DoublyLinkedList<T>::~DoublyLinkedList()
{while (m_size > 0) {delete_node(m_dummyHead->next);}delete m_dummyHead;m_dummyHead = NULL;
}template<class T>
void DoublyLinkedList<T>::push_front(const T& value)
{Node<T>* newNode = new Node<T>(value);newNode->prev = m_dummyHead;newNode->next = m_dummyHead->next;m_dummyHead->next->prev = newNode;m_dummyHead->next = newNode;++m_size;
}template<class T>
void DoublyLinkedList<T>::push_back(const T& value)
{Node<T>* newNode = new Node<T>(value);newNode->prev = m_dummyHead->prev;newNode->next = m_dummyHead;m_dummyHead->prev->next = newNode;m_dummyHead->prev = newNode;++m_size;
}template<class T>
void DoublyLinkedList<T>::insert_after(Node<T>* node, const T& value)
{if (node == NULL || node == m_dummyHead) {return;}Node<T>* newNode = new Node<T>(value);newNode->prev = node;newNode->next = node->next;node->next->prev = newNode;node->next = newNode;++m_size;
}template<class T>
void DoublyLinkedList<T>::delete_node(Node<T>* node)
{if (node == NULL || node == m_dummyHead) {return;}node->prev->next = node->next;node->next->prev = node->prev;delete node;--m_size;
}template<class T>
void DoublyLinkedList<T>::modify(Node<T>* node, const T& value)
{if (node == NULL || node == m_dummyHead) {return;}node->data = value;
}template<class T>
Node<T>* DoublyLinkedList<T>::find(const T& value) const
{Node<T>* curr = m_dummyHead->next;while (curr != m_dummyHead) {if (curr->data == value) {return curr;}curr = curr->next;}return NULL;
}template<class T>
void DoublyLinkedList<T>::print() const
{Node<T>* curr = m_dummyHead->next;while (curr != m_dummyHead) {cout << curr->data << " ";curr = curr->next;}cout << endl;
}template<class T>
int DoublyLinkedList<T>::size() const
{return m_size;
}template<class T>
bool DoublyLinkedList<T>::empty() const
{return m_size == 0;
}int main() {DoublyLinkedList<char> dll;dll.push_back('i'); dll.print();dll.push_back('c'); dll.print();dll.push_back('p'); dll.print();dll.push_back('c'); dll.print();dll.push_front('m'); dll.print();dll.push_front('a'); dll.print();Node<char>* nd = dll.find('a');dll.insert_after(nd, 'c'); dll.print();nd = dll.find('m');dll.insert_after(nd, '/'); dll.print();nd = dll.find('i');dll.modify(nd, 'c'); dll.print();nd = dll.find('m');dll.delete_node(nd); dll.print();cout << dll.empty() << endl;cout << dll.size() << endl;return 0;
}

代码练习1 对应蓝桥云课 小王子双链表 代码见下

#include<iostream>
using namespace std;//双向循环链表
template<typename T>
struct Node {T data;Node* prev;Node* next;Node(const T& value) :data(value), prev(NULL), next(NULL) {}
};template<class T>
class DoublyLinkedList {
public:DoublyLinkedList();~DoublyLinkedList();void push_front(const T& value);void push_back(const T& value);void insert_after(Node<T>* node, const T& value);void delete_node(Node<T>* node);void modify(Node<T>* node, const T& value);Node<T>* find(const T& value) const;void print() const;int size() const;bool empty() const;private:Node<T>* m_dummyHead;int m_size;
};template<class T>
DoublyLinkedList<T>::DoublyLinkedList(): m_size(0)
{m_dummyHead = new Node<T>(T());m_dummyHead->prev = m_dummyHead;m_dummyHead->next = m_dummyHead;
}template<class T>
DoublyLinkedList<T>::~DoublyLinkedList()
{while (m_size > 0) {delete_node(m_dummyHead->next);}delete m_dummyHead;m_dummyHead = NULL;
}template<class T>
void DoublyLinkedList<T>::push_front(const T& value)
{Node<T>* newNode = new Node<T>(value);newNode->prev = m_dummyHead;newNode->next = m_dummyHead->next;m_dummyHead->next->prev = newNode;m_dummyHead->next = newNode;++m_size;
}template<class T>
void DoublyLinkedList<T>::push_back(const T& value)
{Node<T>* newNode = new Node<T>(value);newNode->prev = m_dummyHead->prev;newNode->next = m_dummyHead;m_dummyHead->prev->next = newNode;m_dummyHead->prev = newNode;++m_size;
}template<class T>
void DoublyLinkedList<T>::insert_after(Node<T>* node, const T& value)
{if (node == NULL || node == m_dummyHead) {return;}Node<T>* newNode = new Node<T>(value);newNode->prev = node;newNode->next = node->next;node->next->prev = newNode;node->next = newNode;++m_size;
}template<class T>
void DoublyLinkedList<T>::delete_node(Node<T>* node)
{if (node == NULL || node == m_dummyHead) {return;}node->prev->next = node->next;node->next->prev = node->prev;delete node;--m_size;
}template<class T>
void DoublyLinkedList<T>::modify(Node<T>* node, const T& value)
{if (node == NULL || node == m_dummyHead) {return;}node->data = value;
}template<class T>
Node<T>* DoublyLinkedList<T>::find(const T& value) const
{Node<T>* curr = m_dummyHead->next;while (curr != m_dummyHead) {if (curr->data == value) {return curr;}curr = curr->next;}return NULL;
}template<class T>
void DoublyLinkedList<T>::print() const
{Node<T>* curr = m_dummyHead->next;while (curr != m_dummyHead) {cout << curr->data << " ";curr = curr->next;}cout << endl;
}template<class T>
int DoublyLinkedList<T>::size() const
{return m_size;
}template<class T>
bool DoublyLinkedList<T>::empty() const
{return m_size == 0;
}int main() {DoublyLinkedList<int> dll;for (int i = 1; i <= 10; ++i) {dll.push_back(i);}int n;cin >> n;while (n--) {int x;cin >> x;Node<int>* nd = dll.find(x);dll.delete_node(nd);dll.push_front(x);dll.print();}return 0;
}

http://www.dtcms.com/a/516680.html

相关文章:

  • LCC-S型磁耦合谐振无线电传输系统实现恒压输出simulink
  • 网站开始怎么做的徐州住房与城乡建设部网站
  • Visual Studio Code 高效开发完全指南(2025年更新版)
  • 汽车网站模版wordpress 标签页面
  • Qt5与Qt6的区别
  • 【LeetCode】86. 分隔链表
  • Python实现Jenkins实现自动化执行Job
  • 响应式网站建设服务企业建设企业网站的好处
  • 黑龙江省机场建设集团官网网站wordpress jquery 无法
  • 中国站免费推广入口江门移动网站建设多少钱
  • 打印机内容左右偏移调整指南
  • K 线形态 - 红三兵
  • PINNs for Medical Image Analysis: A Survey
  • 网站建设公司市场开发方案劳动法24小时免费咨询
  • 微信开发 网站备案吗建e网模型下载
  • Spring Boot 3零基础教程,WEB 开发 Spring Boot 错误处理机制 自定义异常页面 笔记46
  • 织梦网站入侵python 编辑wordpress
  • 青海省建设工程在哪个网站发布做网络推广一个月多少钱
  • SQL SERVER 解析XML
  • 算法偏见的社会建构与司法决策中的公平性规制
  • 企业培训笔记:外卖平台后端--套餐管理模块--新建套餐信息
  • 湖北 网站 备案 时间毕业设计做系统网站
  • h5游戏免费下载:骑士冒险
  • 河北城乡建设官网站做群头像的网站在线
  • 操作系统4.1.9 文件保护
  • 【图像算法 - 29】手把手教你用 YOLO + PyQt5 搭建垃圾检测系统(附完整源码)
  • 误差优化方向-1
  • 网站建设制作公司思企互联兰州网站优化公司
  • 沈阳平台网站建设网站开发的实训周的实训过程
  • 希尔排序详解