为什么在执行链接列表时不能“正确删除”?

时间:2019-04-30 05:11:49

标签: c++ list hyperlink

我实现以下代码来删除Head上的元素。当程序运行到“删除p”时,它将影响先前的Head,并且Head变为NULL。发生什么事了?

    Node<T>* p;
    p = Head;
    Head = Head->next;
    delete p;

1 个答案:

答案 0 :(得分:1)

此功能将删除第一个节点(node 头部指出)。如果删除了该节点,则返回true;如果列表为空,则返回false。

在这里使用双指针作为输入参数(head),因为head将 必须更新,并且该值应反映 在此功能之外。

bool deleteHeadElement(Node** head)  
{
    if (*head == nullptr)
    {
        // List is empty, nothing to delete
        return false;
    }

    // Store the node that has to be deleted
    Node* nodeToDelete = *head;

    // Update the head to point to next nodeToDelete
    *head = nodeToDelete->next;

    delete nodeToDelete;

    // 1st element of node has been deleted.
    return true;
}

在调用此函数之后,您可以随后对其进行调用,它将处理在上一次调用之后列表变为空的情况。

注意: 关于值0xfeeefeee,看来您正在尝试以某种方式释放已释放的内存。也许您应该检查一下头部是否正确更新。

此外,请确保仅当使用new分配节点时,才通过使用delete释放节点的内存。如果要指向的内存为NULL,则delete会小心。

如果您已经使用malloc()向节点分配了内存,则应该使用free()进行分配。