我找不到本书第2版的勘误表。我的问题涉及以下代码中的if语句。
void removeHead (Node ** head) {
Node * temp;
if (!(*head)) {
temp = (*head)->next;
delete *head;
*head = temp;
}
}
所以我理解if语句的要点是检查Node是否为null。但是通过添加额外的“!”对评估,这不会否定null的错误值吗?将其更改为以下内容是否正确:
if (*head) { ... }
此外,如果有人知道我在哪里可以找到第二版的官方勘误表,那将是很棒的。
谢谢,
萨姆
答案 0 :(得分:9)
这本书有点瑕疵,它首先声称*head
作为输入没有问题,然后进一步发展说你应该真正传入**head
,然后说你应该检查*head
。您确实需要检查*head
和head
。
对于if (!(*head))
,如果*head
为NULL,则为if (!0)
,这将是真的。然后我们尝试(0)->next
并死亡。绝对是个错误。
答案 1 :(得分:2)
显示的代码不正确:如果*head
为空,则取消引用它,这肯定是不正确的。
答案 2 :(得分:2)
head
是指向Node的指针,你不仅需要检查第二级指针不是null,还要检查第一级指针是否为null,你可以通过添加条件head != NULL
。
此外,正如您在评论中正确指出的那样,条件!(*head)
实际上与您想要执行的操作相反(当true
为NULL时,它将为*head
)。请使用*head != NULL
,它更易读,且不易出错。
答案 3 :(得分:1)
怀疑,无论平台是什么,NULL的值都被认为是零
我对此表示怀疑,我认为比较应始终是wrt
if( * head != NULL )
{ ... }
答案 4 :(得分:0)
*的 *头戴式> *&头戴式GT;头即可。当您执行*head
时,您将取消引用中间位置。当为NULL时,输入if
循环。因此,如果它为NULL,它如何指向head
并要求成员变量next
。这应该可行,如你所建议的那样 -
if((*head) != NULL )
{
// ...
}
答案 5 :(得分:0)
摆脱!
然后将删除更改为免费并重新标记C