首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

C++中的双向链表(未分配要释放的指针)

双向链表是一种常见的数据结构,它由多个节点组成,每个节点包含一个数据项和两个指针,分别指向前一个节点和后一个节点。C++中可以通过定义一个双向链表类来实现该数据结构。

双向链表的优势在于它可以高效地进行插入和删除操作,因为它不需要像数组那样移动大量的元素来维护顺序。另外,双向链表还可以支持双向遍历,即可以从头部开始或尾部开始遍历整个链表。

在C++中,可以使用指针来实现双向链表。每个节点的定义可以如下:

代码语言:txt
复制
class Node {
public:
    int data;
    Node* prev;
    Node* next;
};

在双向链表中,为了方便操作,通常还会定义一个指向头节点和尾节点的指针。下面是一个简单的双向链表类的定义:

代码语言:txt
复制
class DoublyLinkedList {
private:
    Node* head;
    Node* tail;

public:
    // 构造函数和析构函数
    DoublyLinkedList();
    ~DoublyLinkedList();

    // 插入操作
    void insertFront(int value);    // 在链表头部插入节点
    void insertBack(int value);     // 在链表尾部插入节点
    void insertAfter(int key, int value);    // 在指定节点后插入节点

    // 删除操作
    void deleteNode(int value);     // 删除指定值的节点
    void deleteFront();             // 删除头节点
    void deleteBack();              // 删除尾节点

    // 遍历操作
    void displayForward();          // 正向遍历链表
    void displayBackward();         // 反向遍历链表
};

具体的实现可以根据需求进行,下面是一些常用操作的示例实现:

代码语言:txt
复制
DoublyLinkedList::DoublyLinkedList() {
    head = NULL;
    tail = NULL;
}

DoublyLinkedList::~DoublyLinkedList() {
    Node* current = head;
    while (current != NULL) {
        Node* next = current->next;
        delete current;
        current = next;
    }
}

void DoublyLinkedList::insertFront(int value) {
    Node* newNode = new Node;
    newNode->data = value;
    newNode->prev = NULL;
    newNode->next = head;
    if (head != NULL) {
        head->prev = newNode;
    }
    head = newNode;
    if (tail == NULL) {
        tail = newNode;
    }
}

void DoublyLinkedList::insertBack(int value) {
    Node* newNode = new Node;
    newNode->data = value;
    newNode->prev = tail;
    newNode->next = NULL;
    if (tail != NULL) {
        tail->next = newNode;
    }
    tail = newNode;
    if (head == NULL) {
        head = newNode;
    }
}

void DoublyLinkedList::insertAfter(int key, int value) {
    Node* current = head;
    while (current != NULL && current->data != key) {
        current = current->next;
    }
    if (current != NULL) {
        Node* newNode = new Node;
        newNode->data = value;
        newNode->prev = current;
        newNode->next = current->next;
        if (current->next != NULL) {
            current->next->prev = newNode;
        } else {
            tail = newNode;
        }
        current->next = newNode;
    }
}

void DoublyLinkedList::deleteNode(int value) {
    Node* current = head;
    while (current != NULL && current->data != value) {
        current = current->next;
    }
    if (current != NULL) {
        if (current->prev != NULL) {
            current->prev->next = current->next;
        } else {
            head = current->next;
        }
        if (current->next != NULL) {
            current->next->prev = current->prev;
        } else {
            tail = current->prev;
        }
        delete current;
    }
}

void DoublyLinkedList::deleteFront() {
    if (head != NULL) {
        Node* temp = head;
        head = head->next;
        if (head != NULL) {
            head->prev = NULL;
        } else {
            tail = NULL;
        }
        delete temp;
    }
}

void DoublyLinkedList::deleteBack() {
    if (tail != NULL) {
        Node* temp = tail;
        tail = tail->prev;
        if (tail != NULL) {
            tail->next = NULL;
        } else {
            head = NULL;
        }
        delete temp;
    }
}

void DoublyLinkedList::displayForward() {
    Node* current = head;
    while (current != NULL) {
        cout << current->data << " ";
        current = current->next;
    }
    cout << endl;
}

void DoublyLinkedList::displayBackward() {
    Node* current = tail;
    while (current != NULL) {
        cout << current->data << " ";
        current = current->prev;
    }
    cout << endl;
}

这是一个简单的双向链表实现,你可以根据自己的需求对其进行扩展和改进。至于未分配要释放的指针问题,可以在析构函数中遍历链表并释放节点所占用的内存。

关于腾讯云相关产品和产品介绍链接地址,你可以参考腾讯云官方文档进行查询,以获取最准确和最新的信息。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

领券