首页 > 解决方案 > deleteNode 函数似乎破坏了连接列表

问题描述

我正在尝试构建一个模拟服务中心的客户列表类。我的 deleteNode 函数只会正确删除列表的头部而不会破坏链接。

我尝试过绘制链表图表并手动跟踪程序,但在纸上,这对我来说似乎是正确的。问题似乎在 else 语句中的某个地方,但我无法确定在哪里。

#include <string>
using namespace std;

class CustomerList
{
private:

    // structure to represent customer as a node
    struct CustomerNode
    {
        unsigned int sequence_number{};
        string name{}, service_required{};
        int month{}, day{}, year{}, hour{}, minute{};
        struct CustomerNode* next_node{ nullptr };
    };

    // Pointers to first and last node in the linked list
    CustomerNode* head;
    CustomerNode* last_node;

public:


    CustomerList();

    // Class member functions
    void insertNode(string, string, int, int, int, int, int);
    void deleteNode(string);
    void serveCustomer();
    void listAll();

    ~CustomerList();


};
void CustomerList::deleteNode(string name)
{
    CustomerNode* node_ptr;
    CustomerNode* previous_node;

    if (!head)
    {
        cout << "The list is empty." << endl;
        return;
    }

    if (head->name == name)
    {
        node_ptr = head->next_node;
        delete head;
        head = node_ptr;
    }

    else
    {
        node_ptr = head;

        while (node_ptr != nullptr && node_ptr->name != name)
        {
            previous_node = node_ptr;
            node_ptr = node_ptr->next_node;

        }


        if (node_ptr)
        {
            previous_node = node_ptr->next_node;
            delete node_ptr;
        }       

    }
}

如果我有多个节点并删除一个节点,则只应删除该节点。结构中的 next_node 指针应该指向被删除节点之后的节点。相反,当我在链表中​​显示节点时,头部之后的任何节点似乎都指向垃圾数据。

标签: c++linked-list

解决方案


@Richard Chambers 的答案是正确的。您需要设置“previous_node”的“next_node”而不是“previous_node”。
if (node_ptr) { previous_node->next_node = node_ptr->next_node; delete node_ptr; }


推荐阅读