从链接列表中删除值/删除未动态分配的值

时间:2017-08-05 00:47:51

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

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

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;
        }

2 个答案:

答案 0 :(得分:5)

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

其次,该代码块是必要的,因为它删除了要删除的节点 - 如果该节点存在的话。如果节点不存在,它位于if块中。在纸上绘制一个简单的示例,并逐步查看代码,看看如果您尝试删除列表中没有的元素会发生什么。

答案 1 :(得分:0)

delete以前未使用new分配的值不正确。我假设new - 您的教科书暗示了分配。

关于你的第二个问题,

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

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

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