2011-03-01 22 views
4

我无法找到本书第二版的勘误表。我的问题涉及下面一段代码中的if语句。编程面试中的错误暴露?

void removeHead (Node ** head) { 
    Node * temp; 
    if (!(*head)) { 
    temp = (*head)->next; 
    delete *head; 
    *head = temp; 
    } 
} 

所以我明白,if语句的重点是检查节点是否为空。但是,通过添加额外的“!”评估,这不会否定null的虚假值吗?难道是正确的改变它的东西,如:

if (*head) { ... } 

而且如果有人知道在哪里可以找到的第二版,将是巨大的官方勘误表。

感谢,

山姆

+2

问题是...为什么会有人在C++中编写这样的代码?节点应该是一个类,链接列表应该是另一个类的头部作为私有变量,并删除..某些东西应该是一个公共职能。 – Lundin 2011-03-01 10:49:21

+0

官方勘误表http://www.wiley.com/legacy/compbooks/programminginterview/errata。html – kas 2017-04-11 00:23:53

回答

9

这本书,因为它第一次声称,有与*head没有问题作为输入的小缺陷,再进一步发展到说,你真的应该传递**head,然后说你应该检查*head。你真的需要检查*headhead

至于if (!(*head)),如果*head为NULL,这将是if (!0)这将是正确的。然后我们尝试(0)->next并死亡。肯定是一个错误。

+0

这是我正在寻找的答案,至少有两个人说过!(* head)等于* head!= NULL,这就是我所迷惑的。 – Sam 2011-03-01 07:23:51

+0

+1在第一次尝试时没有出错: P – Greg 2011-03-01 07:28:39

+0

@Sam如果他们说,他们错了!!x等于(x == 0)对于任何x。 – 2011-03-01 07:28:46

2

如图所示的代码不正确:如果*head为空,你解引用它,这肯定是不正确。

+0

我没有看到'* head'(即'** head')的引用,只是'head'的引用。否定是这里的问题。 – 2011-03-01 07:01:57

+0

@Ed S .:'if(!(* head))'测试'* head'是否为空;如果它为空,则输入“if”块。 'if'块中的第一行有'(* head) - > next',它取消了(* head)'。这就是我认为我在答案中所说的?也许我不清楚? – 2011-03-01 07:12:56

+0

@ ed x的取消引用不是“即” * x ... x-> y也是x的解引用,这里肯定有一个。 – 2011-03-01 07:31:03

2

head是一个指向节点指针的指针,不仅需要检查第二级指针是否为空,而且第一级指针不为空,您可以通过添加条件来做到这一点head != NULL

而且,正如你在正确的评论所指出的,条件!(*head)实际上是你想要做的正好相反(这将是true*head是NULL)。使用更易读的*head != NULL,而且容易出错。

+0

但是不是“!(* head)”与“* head!= NULL”不同吗?假设* head是NULL ...并不意味着“!(* head)的计算结果为true,并且”* head!= NULL“的计算结果为false? – Sam 2011-03-01 07:13:56

+0

是的,当然,我的错误是,我更正了我的答案。 – Greg 2011-03-01 07:26:51

0

* * head - > * head-> head。当你这样做,*head,你正在解除引导到中间位置。当它为NULL时,输入if循环。所以,如果它是NULL,它如何指向head并请求一个成员变量next。这应该工作,如你所说 -

if((*head) != NULL) 
{ 
    // ... 
} 
1

怀疑,NULL的值是否视为零而不考虑平台?

我怀疑这一点,我想比较应该始终WRT

if(* head != NULL) 
{ ... } 
0

摆脱!

然后更改删除到免费和retag C