带头结点的双向循环链表操作集代码
时间: 2024-12-13 14:21:02 浏览: 15
带头结点的双向循环链表是一种特殊的数据结构,其中每个节点除了包含数据元素外还包含两个指针,一个指向下一个节点,另一个指向前一个节点,形成一个首尾相连的环形。以下是基本的操作集合,包括创建、插入、删除和遍历:
```cpp
// 定义双向循环链表节点结构
struct Node {
int data;
Node* prev;
Node* next;
};
// 创建一个空链表
Node* createList() {
return new Node{0, nullptr, nullptr};
}
// 插入节点到链表头部
void insertAtHead(Node** head, int value) {
Node* newNode = new Node{value, *head, (*head)->prev};
if (*head != nullptr) {
(*head)->prev->next = newNode;
} else {
newNode->next = newNode; // 处理头结点的情况
}
*head = newNode;
}
// 插入节点到链表尾部
void insertAtTail(Node** head, int value) {
Node* newNode = new Node{value, (*head)->prev, *head};
if (*head == nullptr) { // 如果链表为空
newNode->next = newNode;
} else {
(*head)->prev->next = newNode;
}
(*head)->prev = newNode;
}
// 删除指定值的节点
void deleteNode(Node** head, int value) {
Node* current = *head;
while (current != nullptr && current->data != value) {
current = current->next;
}
if (current == nullptr) return; // 节点未找到
// 分离当前节点与前驱节点
if (current->prev != nullptr) {
current->prev->next = current->next;
} else {
*head = current->next; // 链表头结点被删除
}
if (current->next != nullptr) {
current->next->prev = current->prev;
} else {
current->prev->next = nullptr; // 链表尾部节点被删除
}
delete current;
}
// 遍历并打印链表
void traverse(Node* head) {
Node* temp = head;
do {
cout << temp->data << " ";
temp = temp->next;
} while (temp != head);
cout << endl;
}
阅读全文