模拟stl类的list
时间: 2023-08-24 12:07:28 浏览: 108
c模拟c++ stl list
好的,我可以给您讲解一下如何模拟STL的list类。
List是一个双向链表,我们可以通过自己实现节点类和链表类来模拟这个数据结构。
首先,我们需要定义一个节点类,包含前驱节点指针、后继节点指针、以及存储数据的成员变量。代码如下:
```
template <typename T>
class ListNode {
public:
T data;
ListNode* prev;
ListNode* next;
ListNode(T data) : data(data), prev(nullptr), next(nullptr) {}
};
```
接着,我们定义链表类,包含头节点指针和尾节点指针,以及一些常用的操作方法,如插入、删除、查找等。代码如下:
```
template <typename T>
class List {
public:
List() : head(nullptr), tail(nullptr), size(0) {}
~List() { clear(); }
void insert(T data) {
ListNode<T>* node = new ListNode<T>(data);
if (head == nullptr) {
head = node;
tail = node;
} else {
tail->next = node;
node->prev = tail;
tail = node;
}
size++;
}
void remove(T data) {
ListNode<T>* node = head;
while (node != nullptr) {
if (node->data == data) {
if (node == head) {
head = node->next;
if (head != nullptr) {
head->prev = nullptr;
}
} else if (node == tail) {
tail = node->prev;
if (tail != nullptr) {
tail->next = nullptr;
}
} else {
node->prev->next = node->next;
node->next->prev = node->prev;
}
delete node;
size--;
return;
}
node = node->next;
}
}
ListNode<T>* find(T data) {
ListNode<T>* node = head;
while (node != nullptr) {
if (node->data == data) {
return node;
}
node = node->next;
}
return nullptr;
}
void clear() {
ListNode<T>* node = head;
while (node != nullptr) {
ListNode<T>* next = node->next;
delete node;
node = next;
}
head = nullptr;
tail = nullptr;
size = 0;
}
int getSize() const { return size; }
private:
ListNode<T>* head;
ListNode<T>* tail;
int size;
};
```
这样,我们就实现了一个简单的模拟STL的list类。您可以通过调用insert、remove、find等方法来操作链表中的元素。
阅读全文