C ++查找与链表相关的代码中的错误

时间:2014-03-27 02:22:32

标签: c++ list linked-list

我似乎无法找到2个代码。我知道这些内容有问题。每个一个。

int pop()
{
    Node* temp = new Node();
    temp = tail;
    tail->prev()->setNext(NULL);
    int tempV = temp->key();
    delete temp;
    return tempV;
}

另一段代码就是:

int main()
{   
    Node* t = new Node(0,NULL);
    t = Node(1,t);
    t = Node(2,t);
    delete t;
}

我想了两段代码了一段时间。对于第一段代码,我认为错误是您不应该使用关键字new在堆上创建Node * temp。应该是Node* temp = tail;我相信。任何人都可以确认吗?

对于第二段代码,我认为错误是你不需要两者

t = Node(1,t); 
t = Node(2,t); 
编辑::我很抱歉我弄错了。它应该是Node而不是node。我的朋友告诉我它必须要做一些记忆。它有一个内存泄漏,因为多个节点被声明为new?或者我们是否需要最后2个新关键字?

由于

4 个答案:

答案 0 :(得分:0)

弹出元素时,无需创建“新”节点。您必须删除链接列表的最后一个元素 - 不要创建新节点。

对于第二个问题,您不需要

t = node(1,t)
t = node(2,t) 

如果函数返回当前添加的节点。 但是,如果函数返回链表的标题,则需要它。这取决于你如何编写node函数。

答案 1 :(得分:0)

你正在失去新的价值

Node* temp = new Node();  
temp = tail;               <-- you just lost the value you new'ed

然后你要删除一个不同的节点

tail->prev()->setNext(NULL); <-- this line doesn't check that the value for prev() isn't null

关于main中的内容我需要查看更多“node”的代码

答案 2 :(得分:0)

Dinesh在第一个例子中是正确的。这是一个更多的解释。

Node* temp = new Node()
temp = tail;

导致内存泄漏。当你将temp覆盖为tail时,创建的新节点会泄露。正确的方法是

Node * temp = tail;

在第二个例子中,不清楚节点功能的作用。如果你打算写这个:

int main()
{   
    Node* t = new Node(0,NULL);
    t = new Node(1,t);
    t = new Node(2,t);
    delete t;
}

代码更有意义,它从头到尾列出时创建一个包含2,1,0的三个节点的链表。从不完整的例子中很难说清楚。

答案 3 :(得分:0)

pop中,您有内存泄漏。你在堆上构造一个Node,然后立即失去对它的追踪,比如给气球充气并让它走了:

Node* temp = new Node();
temp = tail;

但是你也有一个更严重的问题:你没有调整tail当函数完成时,tail指向最后一个节点的内存区域过去,任何取消引用它的尝试都会导致未定义的行为。

至于你的第二个问题,代码可能是正确的,也可能不是。除非你向我们展示node(...)做什么,否则无法判断。