【问题标题】:Errors when trying to delete head, or node in the middle, of a linked list尝试删除链表的头或中间节点时出错
【发布时间】:2026-01-15 23:00:01
【问题描述】:

我知道哪里出了问题,但我不知道如何改变它。请帮忙!唯一有效的是这个(CurrentNode->next == NULL),如果其他情况没有。我能做什么?

void Restaurant::deletereservation()
{
    string name;        
    cout << "Enter name of customer that you want to delete: " << endl
    << "Name: ";
    cin.ignore(80, '\n');
    getline(cin, name);
    ReservationNode *nodeIn = head;           
    ReservationNode *CurrentNode = head->next;  
    while ((CurrentNode != NULL) && (CurrentNode->Name != name))
    {
        nodeIn = CurrentNode;
        CurrentNode = CurrentNode->next;
    }
    if (CurrentNode->Name != name){
        cout << "Error!!!" << name << " is not found.Cant be deleted if there is no such person." << endl;
    }
    else{
        if (nodeIn == head){
            CurrentNode = head->next;
            CurrentNode = head;
            delete nodeIn;          

        }
        else if(CurrentNode->next == NULL){
            nodeIn ->next = NULL;
            delete CurrentNode;             
        }
        else{
            nodeIn -> next = CurrentNode->next;
            delete CurrentNode; 
        }       
    }

}

【问题讨论】:

  • 你能放一个最小的可编译代码以允许调试和执行吗?只有一种方法,很难重现你的问题
  • 您可以做的是,第一步:获取*.com 的tour,然后:阅读help center,并在此处学习How to Ask 可以回答的问题。任何人都无法帮助您,因为您的问题不符合minimal reproducible example 的所有要求。 C++ 函数并不存在于真空中。它们是否有效取决于您程序中的所有其他功能。你没有显示。没有人可以帮助您处理甚至没有显示的代码。这并不意味着你应该发布你的整个程序,而只是一个minimal reproducible example
  • 不太清楚你为什么声明nodeIn。您使用nodeIn = CurrentNode; 指向与CurrentNode 相同的数据,然后您使用delete nodeIn;

标签: c++ c++14


【解决方案1】:

1:这个

ReservationNode *nodeIn = head;           
ReservationNode *CurrentNode = head->next; 

如果列表为空,则未定义。
如果是,您可以返回。

2:如果在这个循环中找不到节点:

while ((CurrentNode != NULL) && (CurrentNode->Name != name))

CurrentNode 将在循环之后为空,但你继续前进并无条件地取消引用它:

if (CurrentNode->Name != name){

那个测试应该是

if (CurrentNode == NULL){

3:这个

if (nodeIn == head){
    CurrentNode = head->next;
    CurrentNode = head;
    delete nodeIn;          
}

等价于

if (nodeIn == head){
    CurrentNode = head;
    delete head;
}

然后head 指向你刚刚销毁的节点。

应该是

if (nodeIn == head){
    CurrentNode = head;
    head = head->next;
    delete CurrentNode;
}

附注:如果将用户交互与数据操作分开,事情会变得简单得多。

创建一个接受名称并删除相应条目的成员。
将该名称的检索留给主程序。

【讨论】:

    【解决方案2】:

    我不确定这是否正确,因为缺少很多实际代码。

    void Restaurant::deletereservation()
    {
        string name;        
        cout << "Enter name of customer that you want to delete: " << endl
        << "Name: ";
        cin.ignore(80, '\n');
        getline(cin, name);
        ReservationNode *nodeIn = nullptr;           
        ReservationNode *CurrentNode = head;  
        while ((CurrentNode != NULL) && (CurrentNode->Name != name))
        {
            nodeIn = CurrentNode;
            CurrentNode = CurrentNode->next;
        }
        if (CurrentNode == nullptr || CurrentNode->Name != name){
            cout << "Error!!!" << name << " is not found.Cant be deleted if there is no such person." << endl;
            return;
        }
    
        if (CurrentNode == head) {
            head = CurrentNode->next; // Cut off list head (CurrentNode)  
        }
        else{
            nodeIn->next = CurrentNode->next; // Make the list "skip" CurrentNode
        }
        delete CurrentNode;       
    }  
    

    【讨论】:

      最近更新 更多