C++双向链表怎么实现

2023-04-24 00:48:00 链表 双向

C++双向链表实现的思路是:首先定义一个链表结构体,该结构体包含一个数据域和两个指针域,一个指向前一个结点,一个指向后一个结点;其次,定义一个头指针,指向链表的头结点;然后,定义一个尾指针,指向链表的尾结点;最后,定义一个布尔变量,用于标识链表是否为空。

具体实现步骤如下:

1. 定义链表结构体:

struct Node {
    int data;
    Node *prev;
    Node *next;
};

2. 定义头指针和尾指针:

Node *head;
Node *tail;

3. 定义一个布尔变量,用于标识链表是否为空:

bool isEmpty;

4. 初始化头指针和尾指针:

head = nullptr;
tail = nullptr;

5. 初始化布尔变量:

isEmpty = true;

6. 实现插入操作:

void insert(int data) {
    // 创建新结点
    Node *node = new Node;
    node->data = data;
    node->prev = nullptr;
    node->next = nullptr;
 
    // 如果链表为空,则将头指针和尾指针都指向新结点
    if (isEmpty) {
        head = node;
        tail = node;
        isEmpty = false;
        return;
    }
 
    // 如果链表不为空,则将新结点插入到尾结点之后
    tail->next = node;
    node->prev = tail;
    tail = node;
}

7. 实现删除操作:

void remove(Node *node) {
    // 如果链表为空,则无法删除
    if (isEmpty) {
        return;
    }
 
    // 如果要删除的结点是头结点,则将头指针指向头结点的下一个结点
    if (node == head) {
        head = node->next;
        if (head != nullptr) {
            head->prev = nullptr;
        }
    }
 
    // 如果要删除的结点是尾结点,则将尾指针指向尾结点的前一个结点
    if (node == tail) {
        tail = node->prev;
        if (tail != nullptr) {
            tail->next = nullptr;
        }
    }
 
    // 如果要删除的结点在中间,则将其前一个结点的next指针指向其后一个结点,将其后一个结点的prev指针指向其前一个结点
    if (node->prev != nullptr && node->next != nullptr) {
        node->prev->next = node->next;
        node->next->prev = node->prev;
    }
 
    // 释放结点
    delete node;
 
    // 如果删除后链表为空,则将布尔变量设置为true
    if (head == nullptr && tail == nullptr) {
        isEmpty = true;
    }
}

8. 实现查找操作:

Node* search(int data) {
    Node *node = head;
    while (node != nullptr) {
        if (node->data == data) {
            return node;
        }
        node = node->next;
    }
    return nullptr;
}

以上就是C++双向链表的实现过程,它可以用于实现插入、删除和查找操作。

相关文章