gpt4 book ai didi

c++ - 链表删除

转载 作者:行者123 更新时间:2023-11-28 06:00:46 30 4
gpt4 key购买 nike

这是我的删除代码。问题是,当我从尾部或第 n 个节点删除某些内容时,它工作得很好,但每当我从 head 中删除某些内容时,它就会崩溃。为了避免崩溃,我应该进行哪些检查?

void List::Delete(int data) {
// Create a temp pointer
Node *tmp = head;

// No nodes
if ( tmp == NULL )
return;

// Last node of the list
if ( tmp->Next() == NULL ) {
delete tmp;
head = NULL;
}
else {
// Parse through the nodes
Node *prev;
do {
if ( tmp->Data() == data ) break;
prev = tmp;
tmp = tmp->Next();
} while ( tmp != NULL );

// Adjust the pointers
prev->SetNext(tmp->Next());

// Delete the current node
delete tmp;
}

最佳答案

如果要删除的节点是头节点,则会发生以下情况:

您声明Node *prev。请注意,它是未初始化的。然后进入 do while 循环,但在第一个 if 条件处中断,因为 tmp->Data() == data。因此,您退出 do while 循环而不执行下一条语句,这将初始化 prev。现在在循环之外,next 语句访问 prevSetNext 字段,而 previous 是单元化的。这是未定义的行为,任何事情都可能发生;崩溃就是这样的事情。

避免这种情况的方法是添加检查 prev 是否已初始化,或者 'tmp' 是否为头节点。在这种情况下,你应该删除头部,并返回头部之后的节点。由于您的函数具有 void 签名,因此您应该删除头节点,并使头指针引用头之后的节点。

关于c++ - 链表删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33326697/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com