出于某种原因
template <typename T> void SinglyLinkedList<T>::push_back ( T v )
{
node * newNode = new node;
newNode->val = v;
newNode->next = NULL;
if (_root != NULL)
{
node * thisNode = _root;
while (thisNode->next != NULL) thisNode = thisNode->next;
thisNode->next = newNode;
}
else
{
_root = newNode;
}
}
逻辑不正确,我需要一些帮助来弄清楚它是什么。当我测试时
int myArray [] = { 1, 69, -23942, 69, 56, 67 };
SinglyLinkedList<int> myList(myArray, sizeof(myArray)/sizeof(int));
myList.push_back(33);
myList.print();
打印
1->69->-23942->69->56->33->33->33->33->33-> ...
直到程序崩溃。
我会解释我的逻辑,以便你可以找出我错在哪里:
node * newNode = new node;
newNode->val = v;
newNode->next = NULL;
在堆上创建一个新的node
对象,并将其值初始化为v
,并将其指向下一个节点的指针NULL
。这是将添加到列表末尾的节点。列表的结尾将是
(1)next
为NULL
或
(2)不存在,意味着没有元素,因此没有最终元素
对于微观可比性,因为我希望案例(1)更频繁地发生,所以我把它放在要跟随的if
子句中,并将case(2)放在else
子句中。 / p>
当且仅当_root
node
为NULL
时,才会出现情况(2),这意味着该列表为空,并且处理它只是为了{{1} }是_root
:
newNode
案例(1)要求找到最终节点并将其 else
{
_root = newNode;
}
设置为next
,这应该通过3行非常简单地完成
newNode
该逻辑的缺陷是什么?
答案 0 :(得分:0)
错误在您的构造函数中。这一行:
delete lastNode;
正在删除您仍在使用的内存(lastnode
指向的节点刚刚放入您的列表中)。
删除该行。
编辑:进一步说明。一旦lastnode
指向的内存被释放,运行时就可以再次使用该内存进行另一次new
调用。在您的情况下,您可能最终指向newNode
和thisNode
指向同一位置,导致节点指向自身。
答案 1 :(得分:0)
当你删除最后一个节点时,其下一个节点被删除的节点和前一个下一个指针不为空,所以当您解析链接列表时,你指向未知的内存位置!!!