2012-07-07 133 views
2

以下是从Adam Drozdek的C++(第二版)中的数据结构和算法的单向链表实现的代码摘录,其涉及删除具有给定值的节点。链接列表实现中的错误

IntNode *tmp = head->next; 
head = head->next; 
delete tmp; 

在别处定义为IntNode *)是否有在该代码片段错别字,或者是我在头不正确精神处理器永远是上述每次执行后一个空指针代码片段?

+0

上述代码中没有设置为'NULL'... – 2012-07-07 18:37:23

+0

'delete tmp!=(tmp = nullptr)' – mavam 2012-07-07 18:38:15

+0

我想确保我正确地解释代码。考虑一个链表,其中包含两个节点--1(头)和2.第一行代码的_tmp_指向_head-> next_,它是节点2.第二行的_head_指向_head-> next_,它也是节点2。第三行释放_tmp_ - 节点2指向的空间。因此,将来不会调用* head会导致程序崩溃,因为_tmp_指向的空间被释放了?如果不是崩溃,它肯定会导致错误呢? – JellalF 2012-07-07 18:55:45

回答

0

当您编写delete tmp时,您正在删除tmp指向的对象。但删除后head仍然会指向同一个地方。解除引用(*head)将导致问题,因为head指向的对象已被删除。

+0

谢谢。这就是我的意思,但我做了这样的假设,即删除也将相应的指针设置为NULL。 – JellalF 2012-07-07 19:01:50

0

不,它会指向列表中的第二个元素(现在是第一个元素)。

+0

当然,如果头是列表中唯一的元素,那么head-> next将最初为NULL,然后head将为NULL。 – MRAB 2012-07-07 18:40:50

+1

但是该元​​素现在将被删除。 – 2012-07-07 18:47:20