C++ 编程面试中的漏洞暴露:链表
我正在翻阅这本书。有一个代码用于在链表前面插入一个元素C++ 编程面试中的漏洞暴露:链表,c++,list,insert,linked-list,C++,List,Insert,Linked List,我正在翻阅这本书。有一个代码用于在链表前面插入一个元素 bool insertInFront( IntElement **head, int data ){ IntElement *newElem = new IntElement; if( !newElem ) return false; newElem->data = data; *head = newElem; return true; } 这段代码怎么会忘记更新新元素的下一个指针呢?虽然我确
bool insertInFront( IntElement **head, int data ){
IntElement *newElem = new IntElement;
if( !newElem ) return false;
newElem->data = data;
*head = newElem;
return true;
}
这段代码怎么会忘记更新新元素的下一个指针呢?虽然我确信代码是错误的,但我只想确认我的链表概念并没有严重错误
我相信代码应该在正确的位置添加以下行
newElem->next = *head;
有人能告诉我我是对还是错吗?因为这是在前面插入的,所以你是对的。新节点的下一个应该是当前头部,然后头部应该设置为指向新节点
bool insertInFront( IntElement **head, int data ){
IntElement *newElem = new IntElement;
if( !newElem ) return false;
newElem->data = data;
newElem->next = *head;
*head = newElem;
return true;
}
当然,这里还有其他一些不好的风格和设计,或者完全错误。因为这是在前面插入的,所以您是对的。新节点的下一个应该是当前头部,然后头部应该设置为指向新节点
bool insertInFront( IntElement **head, int data ){
IntElement *newElem = new IntElement;
if( !newElem ) return false;
newElem->data = data;
newElem->next = *head;
*head = newElem;
return true;
}
当然,这里还有其他一些不好的风格和设计,或者只是简单的错误。 < P>我不确定你在读什么样的采访书,但是这个代码例子是可怕的C++。p>
是的,在覆盖磁头之前,您需要将newElem->指向旧磁头旁边。此外,没有理由检查NeReMe是否为空——如果不能分配,C++会抛出异常。此外,插入前应该是一个成员的函数,而头应该是一个数据成员。 < P>我不确定你在读什么样的采访书,但是这个代码例子是可怕的C++。p>
是的,在覆盖磁头之前,您需要将newElem->指向旧磁头旁边。此外,没有理由检查NeReMe是否为空——如果不能分配,C++会抛出异常。另外,insertInFront应该是InteElement的成员函数,head应该是数据成员。您可以将其视为bug。您的答案很好。除了UGLYNY之外,代码没有更多的问题:YCK,那就是C++?new never返回null,第一个参数应该是reference never检查null,pass null检查head和boom;引用跳过了这一混乱,IntElement应该有一个构造函数来获取数据,否则你在构造和分配数据,而不是只是初始化,是的,它忘记了在旧的头中链接。Sherlock可能会说,面试的问题是找到这个代码的问题,所以这本书似乎可以追溯到2000年左右。在这种情况下,他们可能是针对一个尚未符合'98标准的编译器工作的。当时VS6是最新的,但肯定与标准有很多偏差。这可以解释空测试的问题。但即便如此,总体而言,它仍然是糟糕的代码。您可以将其视为一个bug。您的答案很好。除了UGLYNY之外,代码没有更多的问题:YCK,那就是C++?new never返回null,第一个参数应该是reference never检查null,pass null检查head和boom;引用跳过了这一混乱,IntElement应该有一个构造函数来获取数据,否则你在构造和分配数据,而不是只是初始化,是的,它忘记了在旧的头中链接。Sherlock可能会说,面试的问题是找到这个代码的问题,所以这本书似乎可以追溯到2000年左右。在这种情况下,他们可能是针对一个尚未符合'98标准的编译器工作的。当时VS6是最新的,但肯定与标准有很多偏差。这可以解释空测试的问题。但即便如此,总体而言,它仍然是糟糕的代码。