在C ++中删除双向链接列表的头节点后发生访问冲突异常

问题描述 投票:0回答:1

这是我的删除功能

void deleteNode(Node** head, Node* deletingNode) {
    if (head == NULL || deletingNode == NULL)
        return;
    if (*head == deletingNode) {
        *head = deletingNode->next;
        displayNode(*head); //This is to check if the head has changed. And it has.
    }
    if (deletingNode->next != NULL)
        deletingNode->next->prev = deletingNode->prev;
    if (deletingNode->prev != NULL)
        deletingNode->prev->next = deletingNode->next;
    delete(deletingNode);
    return;
}

删除头节点并尝试对链表进行任何操作后,例如,像这样显示整个链表

void displayNode(Node* node) {
    cout << left << setw(4) << node->employee.empID
        << left << setw(20) << node->employee.empName
        << left << setw(8) << node->employee.empSalary
        << left << setw(25) << node->employee.empAddress
        << left << setw(15) << node->employee.empPhone
        << left << setw(2) << node->employee.depNo
        << left << setw(28) << node->employee.depName
        << left << setw(4) << node->employee.performance
        << '\n';
}
void displayAllNodes(Node* node) {
    displayColumnNames();
    while (node != NULL) {
        displayNode(node);
        node = node->next;
    }
}

在上面的代码块的第二行抛出异常

Exception thrown at 0x78DBE26E (ucrtbased.dll) in Project.exe: 0xC0000005: Access violation reading location 0xDDDDDDDD. occurred

仅在删除头节点时才会发生。如果我删除任何其他节点,效果很好。

到目前为止,我已经尝试将deleteNode函数中的双指针转换为单指针,但这没有什么区别。

整个代码:https://codeshare.io/5oV8Jr

c++ linked-list access-violation head
1个回答
0
投票

更新:遵循注释部分的修复程序(由于[C​​0]和drescherjm),这是我发现的另一个错误,并且对此有一个快速修复。

我相信这部分代码存在问题:

Igor Tandetnik

如果链接列表中只有1个节点,并且您呼叫if (*head == deletingNode) { *head = deletingNode->next; displayNode(*head); //This is to check if the head has changed. And it has. } ,该怎么办。现在deleteNode()head指向同一个节点,并且deletingNode将头设置为*head = deletingNode->next;,之后您将调用NULL,这将引发错误。

快速修复:

displayNode(*head);
© www.soinside.com 2019 - 2024. All rights reserved.