当前位置:实例文章 » 其他实例» [文章]数据结构初阶--带头双向循环链表

数据结构初阶--带头双向循环链表

发布人:shili8 发布时间:2025-03-11 00:41 阅读次数:0

**数据结构初阶——带头双向循环链表**

在计算机科学中,数据结构是指组织和存储数据的方式。链表是一种常见的线性数据结构,它通过指针将元素连接起来。在本文中,我们将讨论带头双向循环链表(Circular Doubly Linked List)的基本概念、实现以及示例代码。

**什么是带头双向循环链表?**

带头双向循环链表是一种特殊的链表结构,它具有以下特点:

* 每个结点都有一个指向前驱结点(prev)的指针和一个指向后继结点(next)的指针。
* 链表形成一个环状结构,最后一个结点的next指针指向第一个结点。

**带头双向循环链表的操作**

带头双向循环链表支持以下基本操作:

* **插入**:在指定位置插入新元素。
* **删除**:从指定位置删除元素。
* **查找**:根据关键字查找元素。
* **遍历**:按照顺序访问所有元素。

**带头双向循环链表的实现**

下面是带头双向循环链表的基本实现代码:

cpp// 结点结构体struct Node {
 int data; // 元素值 Node* prev; // 前驱结点指针 Node* next; // 后继结点指针};

// 双向循环链表类class CircularDoublyLinkedList {
private:
 Node* head_; // 头结点指针public:
 // 构造函数 CircularDoublyLinkedList() : head_(nullptr) {}

 // 析构函数 ~CircularDoublyLinkedList() { clear(); }

 // 清空链表 void clear() {
 Node* current = head_;
 while (current != nullptr) {
 Node* next = current->next;
 delete current;
 current = next;
 }
 head_ = nullptr;
 }

 // 插入元素 void insert(int data, int position) {
 Node* newNode = new Node();
 newNode->data = data;

 if (head_ == nullptr) { // 链表为空,直接将新结点设为头结点 head_ = newNode;
 newNode->next = newNode;
 newNode->prev = newNode;
 } else {
 Node* current = head_;
 for (int i =0; i < position -1; ++i) { // 找到插入位置的前驱结点 current = current->next;
 }

 newNode->next = current->next;
 newNode->prev = current;
 newNode->next->prev = newNode;

 if (position ==0) { // 插入到头结点前 head_->prev = newNode;
 head_ = newNode;
 } else {
 current->next = newNode;
 }
 }
 }

 // 删除元素 void deleteNode(int position) {
 Node* current = head_;
 for (int i =0; i < position -1; ++i) { // 找到删除位置的前驱结点 current = current->next;
 }

 if (position ==0) { // 删除头结点 Node* next = head_->next;
 delete head_;
 head_ = next;
 head_->prev = head_;
 } else {
 Node* nodeToDelete = current->next;
 current->next = nodeToDelete->next;

 if (nodeToDelete == head_) { // 删除最后一个结点 head_->prev = current;
 }

 delete nodeToDelete;
 }
 }

 // 查找元素 bool find(int data) {
 Node* current = head_;
 do {
 if (current->data == data) return true; // 找到目标元素 current = current->next;
 } while (current != head_); // 遍历整个链表 return false; // 未找到目标元素 }

 // 遍历链表 void traverse() {
 Node* current = head_;
 do {
 std::cout << current->data << " ";
 current = current->next;
 } while (current != head_);
 std::cout << std::endl; // 输出结点值 }
};

**示例代码**

cppint main() {
 CircularDoublyLinkedList list;

 // 插入元素 list.insert(10,0);
 list.insert(20,1);
 list.insert(30,2);

 // 输出链表内容 std::cout << "链表内容:";
 list.traverse();

 // 删除元素 list.deleteNode(1);

 // 输出链表内容 std::cout << "删除后链表内容:";
 list.traverse();

 return0;
}

**输出结果**

链表内容:102030删除后链表内容:1030


在本文中,我们讨论了带头双向循环链表的基本概念、实现以及示例代码。带头双向循环链表是一种特殊的链表结构,它具有前驱结点和后继结点指针,以及形成一个环状结构的特点。我们通过提供的示例代码,展示了如何在C++中实现带头双向循环链表,并演示了基本操作,如插入、删除、查找和遍历。

相关标签:数据结构
其他信息

其他资源

Top