什么错误的逻辑导致我的链表的push_back(...)函数失败?

时间:2015-04-19 02:28:57

标签: c++ algorithm data-structures linked-list

出于某种原因

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)nextNULL

的最终元素

(2)不存在,意味着没有元素,因此没有最终元素

对于微观可比性,因为我希望案例(1)更频繁地发生,所以我把它放在要跟随的if子句中,并将case(2)放在else子句中。 / p>

当且仅当_root nodeNULL时,才会出现情况(2),这意味着该列表为空,并且处理它只是为了{{1} }是_root

newNode

案例(1)要求找到最终节点并将其 else { _root = newNode; } 设置为next,这应该通过3行非常简单地完成

newNode

该逻辑的缺陷是什么?

2 个答案:

答案 0 :(得分:0)

错误在您的构造函数中。这一行:

delete lastNode;

正在删除您仍在使用的内存(lastnode指向的节点刚刚放入您的列表中)。

删除该行。

编辑:进一步说明。一旦lastnode指向的内存被释放,运行时就可以再次使用该内存进行另一次new调用。在您的情况下,您可能最终指向newNodethisNode指向同一位置,导致节点指向自身。

答案 1 :(得分:0)

当你删除最后一个节点时,其下一个节点被删除的节点和前一个下一个指针不为空,所以当您解析链接列表时,你指向未知的内存位置!!!