C++实现双向循环链表:创建、查询与删除

本文提供了一个使用C++编写的双向循环链表示例,包括创建、查询和删除操作,并对每个函数进行详细讲解。cpp#include

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

// 创建双向循环链表DoublyCircularLinkedList* createDoublyCircularLinkedList() { int n; std::cout << '请输入节点数目: '; std::cin >> n;

DoublyCircularLinkedList* head = nullptr;    DoublyCircularLinkedList* prevNode = nullptr;

for (int i = 0; i < n; i++) {        int value;        std::cout << '请输入第 ' << i+1 << ' 个节点的值: ';        std::cin >> value;

    DoublyCircularLinkedList* newNode = new DoublyCircularLinkedList;        newNode->data = value;

    if (head == nullptr) {            head = newNode;        } else {            prevNode->next = newNode;            newNode->prev = prevNode;        }

    prevNode = newNode;    }

// 将最后一个节点的next指向head,并将head的prev指向最后一个节点,形成循环链表    prevNode->next = head;    head->prev = prevNode;

return head;}

// 查询双向循环链表void searchDoublyCircularLinkedList(DoublyCircularLinkedList* head, int target) { if (head == nullptr) { std::cout << '链表为空' << std::endl; return; }

DoublyCircularLinkedList* current = head;    bool found = false;

do {        if (current->data == target) {            found = true;            std::cout << '找到目标值 ' << target << std::endl;        }

    current = current->next;    } while (current != head);

if (!found) {        std::cout << '未找到目标值 ' << target << std::endl;    }}

// 删除双向循环链表中的节点void deleteNode(DoublyCircularLinkedList*& head, int target) { if (head == nullptr) { std::cout << '链表为空' << std::endl; return; }

DoublyCircularLinkedList* current = head;

// 遍历链表,找到目标节点    while (current->data != target) {        current = current->next;

    // 如果遍历回到了头节点,说明节点不存在        if (current == head) {            std::cout << '未找到目标节点 ' << target << std::endl;            return;        }    }

// 删除目标节点    if (current == head) {        // 如果目标节点是头节点,需要更新头节点的指针        head = head->next;    }

current->prev->next = current->next;    current->next->prev = current->prev;    delete current;

std::cout << '成功删除节点 ' << target << std::endl;}

// 打印双向循环链表void printDoublyCircularLinkedList(DoublyCircularLinkedList* head) { if (head == nullptr) { std::cout << '链表为空' << std::endl; return; }

DoublyCircularLinkedList* current = head;

do {        std::cout << current->data << ' ';        current = current->next;    } while (current != head);

std::cout << std::endl;}

// 释放双向循环链表的内存void releaseDoublyCircularLinkedList(DoublyCircularLinkedList*& head) { if (head == nullptr) { return; }

DoublyCircularLinkedList* current = head->next;    DoublyCircularLinkedList* temp;

while (current != head) {        temp = current;        current = current->next;        delete temp;    }

delete head;    head = nullptr;}

int main() { DoublyCircularLinkedList* head = createDoublyCircularLinkedList(); printDoublyCircularLinkedList(head);

int target;    std::cout << '请输入要查找的目标值: ';    std::cin >> target;    searchDoublyCircularLinkedList(head, target);

std::cout << '请输入要删除的节点值: ';    std::cin >> target;    deleteNode(head, target);    printDoublyCircularLinkedList(head);

releaseDoublyCircularLinkedList(head);

return 0;}

函数解析:

  1. createDoublyCircularLinkedList(): 该函数用于创建双向循环链表。 - 首先,用户需要输入节点的数量和每个节点的值。 - 然后,函数动态分配内存创建新节点,并将节点值存储在data成员变量中。 - 函数通过prevnext指针将节点连接起来,并最终将最后一个节点的next指向头节点,将头节点的prev指向最后一个节点,形成循环链表。 - 函数返回链表的头结点。

  2. searchDoublyCircularLinkedList(): 该函数用于查询双向循环链表中是否存在目标值。 - 首先,函数检查链表是否为空。 - 然后,函数遍历链表,并在找到目标值时输出信息。 - 如果遍历完整个链表都没有找到目标值,则输出未找到的信息。

  3. deleteNode(): 该函数用于删除双向循环链表中的节点。 - 首先,函数检查链表是否为空。 - 然后,函数遍历链表,找到目标节点。 - 如果目标节点是头节点,需要更新头节点的指针。 - 最后,函数删除目标节点,并释放其内存空间。

  4. printDoublyCircularLinkedList(): 该函数用于打印双向循环链表的所有节点值。 - 首先,函数检查链表是否为空。 - 然后,函数遍历链表,并打印每个节点的值。

  5. releaseDoublyCircularLinkedList(): 该函数用于释放双向循环链表的内存。 - 首先,函数检查链表是否为空。 - 然后,函数遍历链表,并删除每个节点。 - 最后,函数将头节点指针设置为nullptr

主函数

在主函数中,我们首先创建双向循环链表并打印它,然后询问用户要查找的目标值,并进行查询操作。接下来,询问用户要删除的节点值,并进行删除操作。最后,释放链表的内存。

这段代码提供了一个简单易懂的双向循环链表实现示例,可以帮助您更好地理解双向循环链表的概念和操作方法。

C++实现双向循环链表:创建、查询与删除

原文地址: https://www.cveoy.top/t/topic/hY1 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录