御坂主机 发表于 2024-6-23 12:05:32

C++ list 模拟实现

本帖最后由 御坂主机 于 2024-6-23 15:38 编辑

1. 引言
C++中的`std::list`是一个双向链表容器,提供高效的插入和删除操作。虽然C++标准库已经提供了这个容器,但了解其内部实现有助于加深对数据结构和指针操作的理解。本文将详细介绍如何在C++中模拟实现一个简单的`list`。

2. 双向链表概述
双向链表是一种链式数据结构,其中每个节点包含三个部分:数据、指向前一个节点的指针和指向下一个节点的指针。这使得在双向链表中,可以从任何一个节点高效地访问前一个和下一个节点。

3. 模拟实现C++ `list`
为了实现一个简化版的`list`,我们需要定义节点结构、链表类以及一些基本操作,如插入、删除和遍历。

3.1 定义节点结构
首先,我们定义一个节点结构,每个节点包含数据、前向指针和后向指针。

struct Node {
    int data;
    Node* prev;
    Node* next;
    Node(int value) : data(value), prev(nullptr), next(nullptr) {}
};

3.2 定义链表类
接下来,定义链表类,包含指向头节点和尾节点的指针,以及一些操作函数。

class List {
private:
    Node* head;
    Node* tail;
public:
    List() : head(nullptr), tail(nullptr) {}
    ~List();
    void push_back(int value);
    void push_front(int value);
    void pop_back();
    void pop_front();
    void display() const;
};

3.3 析构函数
链表类的析构函数需要释放所有节点的内存,以避免内存泄漏。

List::~List() {
    Node* current = head;
    while (current != nullptr) {
      Node* nextNode = current->next;
      delete current;
      current = nextNode;
    }
}

3.4 插入操作
实现链表的插入操作,包括在链表尾部插入和在链表头部插入。

void List::push_back(int value) {
    Node* newNode = new Node(value);
    if (tail == nullptr) {
      head = tail = newNode;
    } else {
      tail->next = newNode;
      newNode->prev = tail;
      tail = newNode;
    }
}

void List::push_front(int value) {
    Node* newNode = new Node(value);
    if (head == nullptr) {
      head = tail = newNode;
    } else {
      head->prev = newNode;
      newNode->next = head;
      head = newNode;
    }
}

3.5 删除操作
实现链表的删除操作,包括从链表尾部删除和从链表头部删除。

void List::pop_back() {
    if (tail == nullptr) return;
    Node* temp = tail;
    if (tail->prev != nullptr) {
      tail = tail->prev;
      tail->next = nullptr;
    } else {
      head = tail = nullptr;
    }
    delete temp;
}

void List::pop_front() {
    if (head == nullptr) return;
    Node* temp = head;
    if (head->next != nullptr) {
      head = head->next;
      head->prev = nullptr;
    } else {
      head = tail = nullptr;
    }
    delete temp;
}

3.6 遍历链表
实现一个遍历链表的函数,打印每个节点的值。

void List::display() const {
    Node* current = head;
    while (current != nullptr) {
      std::cout << current->data << " ";
      current = current->next;
    }
    std::cout << std::endl;
}

4. 测试链表
最后,通过主函数测试链表的各种操作,确保实现正确。

int main() {
    List myList;
    myList.push_back(1);
    myList.push_back(2);
    myList.push_back(3);
    myList.display();

    myList.push_front(0);
    myList.display();

    myList.pop_back();
    myList.display();

    myList.pop_front();
    myList.display();

    return 0;
}

5. 总结
本文详细介绍了如何在C++中模拟实现一个双向链表(`list`)。通过定义节点结构、实现链表类以及各种操作函数,我们实现了一个简化版的`list`。了解这些底层实现有助于更好地掌握数据结构的基本概念和指针操作技巧。希望本文能帮助读者加深对C++链表实现的理解。






------------------------------------------------------------------------------------------------------------------------------------------
========御 坂 主 机========
>> VPS主机 服务器 前沿资讯 行业发布 技术杂谈 <<
>> 推广/合作/找我玩TG号 : @Misaka_Offical <<
-------------------------------------------------------------------------------------------------------------------------------------------
页: [1]
查看完整版本: C++ list 模拟实现