我似乎无法找到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个新关键字?
由于
答案 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(...)
做什么,否则无法判断。