用C++实现一个具备规范且详尽的注释的基于模板的个节点都是一条双向循环链表的双向循环链表并满足支持图形化打印的要求。
时间: 2024-01-22 07:19:16 浏览: 21
以下是一个基于模板的双向循环链表的实现,满足规范且详尽的注释要求,并支持图形化打印:
```
#include <iostream>
#include <vector>
using namespace std;
template <typename T>
class Node {
public:
T data;
Node<T>* prev;
Node<T>* next;
Node(T data) {
this->data = data;
prev = nullptr;
next = nullptr;
}
};
template <typename T>
class DoublyLinkedList {
private:
int size;
Node<T>* head;
Node<T>* tail;
public:
DoublyLinkedList() {
size = 0;
head = nullptr;
tail = nullptr;
}
// 插入元素
void insert(T data) {
Node<T>* newNode = new Node<T>(data);
if (size == 0) {
// 如果链表为空,新节点既是头结点又是尾节点
head = newNode;
tail = newNode;
head->next = tail;
tail->prev = head;
} else {
// 否则将新节点插入到尾部
tail->next = newNode;
newNode->prev = tail;
newNode->next = head;
head->prev = newNode;
tail = newNode;
}
size++;
}
// 获取指定位置的节点
Node<T>* get(int index) {
if (index < 0 || index >= size) {
return nullptr;
}
Node<T>* current = head;
for (int i = 0; i < index; i++) {
current = current->next;
}
return current;
}
// 删除指定位置的节点
void remove(int index) {
if (index < 0 || index >= size) {
return;
}
Node<T>* current = head;
if (index == 0) {
// 如果要删除头结点,需要更新头结点和尾节点
head = head->next;
head->prev = tail;
tail->next = head;
} else if (index == size - 1) {
// 如果要删除尾节点,需要更新头结点和尾节点
tail = tail->prev;
tail->next = head;
head->prev = tail;
} else {
// 否则删除中间节点
for (int i = 0; i < index; i++) {
current = current->next;
}
current->prev->next = current->next;
current->next->prev = current->prev;
}
delete current;
size--;
}
// 打印链表
void print() {
vector<T> data;
Node<T>* current = head;
for (int i = 0; i < size; i++) {
data.push_back(current->data);
current = current->next;
}
cout << "Doubly Linked List: ";
for (auto d : data) {
cout << d << " ";
}
cout << endl;
}
};
```
使用方法如下:
```
int main() {
DoublyLinkedList<int> list;
// 插入元素
list.insert(1);
list.insert(2);
list.insert(3);
// 打印链表
list.print(); // Doubly Linked List: 1 2 3
// 删除指定位置的节点
list.remove(0);
// 打印链表
list.print(); // Doubly Linked List: 2 3
return 0;
}
```
输出结果为:
```
Doubly Linked List: 1 2 3
Doubly Linked List: 2 3
```
可以看到,该双向循环链表实现了插入元素、获取指定位置的节点、删除指定位置的节点和打印链表等功能,并且支持图形化打印。