此代码安全吗?(链表,C++)
Is this code safe? (linked list, C++)
以下代码似乎可以正常工作,可以从链表中删除节点:
bool remove(node * & head, int toBeRemoved)
{
if (head == nullptr) //empty list
return false;
else {
node * temp = head;
//the first node needs to be removed
if (head->data == toBeRemoved) {
head = head->next;
delete temp;
return true;
}
//seek for node and remove it
else {
while (temp->next != nullptr && temp->next->data != toBeRemoved)
temp = temp->next;
if (temp->next->data == toBeRemoved){
node * removeThis = temp->next;
temp->next = temp->next->next;
delete removeThis;
return true;
}
//data to be removed can't be found in the list
else
if (temp->next == nullptr && temp->next->data != toBeRemoved)
return false;
}
}
}
(我知道C++中有一个列表实现,但我只是想在这里理解这个算法,而不是用其他东西替换它(。
即使代码在删除放置在列表开头、中间或结尾的节点时有效并且我没有看到任何错误,但我仍然对以下行有一些疑问:if (temp->next->data == toBeRemoved)
.
由于当要删除的节点是最后一个节点(即:temp->next==nullptr
(时可以执行整个块,因此我想知道尝试访问temp->next->data
的安全性如何。
即使它是安全的,这是一个糟糕的编程实践吗?
不,那条线不安全。
当 temp->next
为 null 指针或temp->next->data
包含要删除的值时,while
循环结束。如果它因第一个原因而结束,则访问temp->next->data
无效,因为它通过空指针进行间接。
您应该在while
循环结束后更改测试的顺序。首先检查空指针。如果它不是空指针,则表示您找到了该元素,您可以将其删除。
while (temp->next != nullptr && temp->next->data != toBeRemoved) {
temp = temp->next;
}
if (temp->next == nullptr) { // data couldn't be found
return false;
} else { // data was found, remove it
node * removeThis = temp->next;
temp->next = temp->next->next;
delete removeThis;
return true;
}
}
相关文章:
- 反向给定链表中的K节点
- 如果没有malloc,链表实现将失败
- 文本文件中的单词链表
- 努力将整数转换为链表。不知道我在这里做错了什么
- 链表,反向函数,数据结构
- 使用std::list创建循环链表
- 链表的泛型函数remove()与成员函数remove)
- 为什么不能修改对象中的值?另外,我如何改进此链表?
- 我们可以删除链表中静态内存中的节点吗
- C++,指针数组,指向双链表中的条目
- 链表中写入访问冲突的未知原因
- 如何修复链表类实现的未处理异常0xDDDDDDDD
- 打印所有链表的元素 (C++)
- 错误:需要类名(链表c++)
- 为什么C中的通用链表中存储的数据已损坏
- C++ 创建包含链表和字符串的对象的链接列表时出错
- 链表c++插入,所有情况都已检查,但没有任何工作
- 链表,将列表复制到另一个列表
- 为什么C++对链表中的下一个节点使用指针,而像 C# 或 Java 这样的语言只使用类 Node 的名称?
- 对单向链表进行排序时出现运行时错误