【问题标题】:removing a value from a linked list/deleting values that were not dynamically allocated从链表中删除值/删除未动态分配的值
【发布时间】:2018-01-13 00:08:22
【问题描述】:

我的教科书有以下用于从链表中删除元素的代码。

void remove(double num)
{
    Node *cur, *prev;
    if(!head){
        return;
    }
    if(head->data == num)
    {
        cur = head;
        head = head->next;
        delete cur;
    }
    else{
        cur = head;
        while(cur!=NULL && cur->data != num)
        {
            prev = cur;
            cur= cur->next;
        }
        if(cur)
        {
            prev->next = cur->next;
            delete cur;
        }
    }
}

我对这段代码有几个问题。首先,如何删除一个不是动态分配的值?为什么这是必要的?我在任何地方都没有看到新的声明。其次,为什么需要这段代码?为什么它需要在 if 语句中?

if(cur)
        {
            prev->next = cur->next;
            delete cur;
        }

【问题讨论】:

  • 这段代码孤立起来没有意义,什么是head?这是对象的方法吗?如果是这样,它可能已在其他地方动态分配。此外,即使按照学术编码的标准,这本教科书也很糟糕。未初始化的变量?哎呀。

标签: c++ linked-list dynamic-memory-allocation


【解决方案1】:

首先,此代码假定节点是动态分配的。这就是通常构建链表的方式。如果您的代码使用堆栈上的节点,则只需删除 delete 语句。 (并考虑一下如何跟踪正在使用的节点。)

其次,该代码块是必要的,因为它删除了要删除的节点——如果该节点存在的话。如果节点不存在,它位于if 块中。在纸上画一个简单的例子,然后逐步检查代码,看看如果你试图删除一个不在列表中的元素会发生什么。

【讨论】:

  • 为了澄清 Beta 的观点,if(cur)if(cur != NULL) 是一回事
  • @zzxyz:是的,我应该解释一下。谢谢。
  • 谢谢,伙计们,这真的澄清了 if 语句的问题。不过,我不得不承认,对于删除看似没有新声明的东西的问题,我仍然有些困惑。我一定是错过了什么。
  • 在书中四处寻找一个名为“add”的函数 :) 几乎可以肯定某处有一个新语句。
  • 没有看到代码的其余部分(如果可能,作为minimal complete solution),我们无法判断是否存在new 语句。直接回答你的问题,如果剩下的代码使用上面的函数来移除一个不是动态创建的节点,那么结果就是UB,代码非常非常错误。
【解决方案2】:

delete 是不正确的,该值以前没有分配给 new。我假设您的教科书暗示了new-allocation。

关于你的第二个问题,在

之后
while(cur!=NULL && cur->data != num){...} 

已完成,cur == NULLcur != NULL && cur->data == numif (cur) 实际上是 if (cur != NULL),这意味着 cur 包含您正在寻找的值。

需要块本身来删除找到的元素,方法是将前一个元素的next 指针更改为元素,该元素位于被删除元素之后。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-05
    • 2013-04-12
    • 1970-01-01
    • 1970-01-01
    • 2021-12-05
    相关资源
    最近更新 更多