0

我正在尝试在链表的末尾插入一个新节点。但是,当我尝试时,我会在插入点遇到分段错误。我知道首选的方法是“head -> next”样式,但是对于分配,我们一直坚持做它。帮助?

谢谢!

#include <iostream>
using namespace std;

struct NodeType;
typedef NodeType *NodePtr;

struct NodeType
{
   int data;
   NodePtr next;
};

int main ()
{
   NodePtr head;
   NodePtr temp;
   NodePtr tempTwo;
   NodePtr tempThree;
   NodePtr tempFour;

   head = new NodeType;
   (*head).data = 5;
   (*head).next = NULL;

   temp = new NodeType;
   (*temp).data = 8;
   (*temp).next = head;
   head = temp;
   delete temp;

   tempTwo = new NodeType;
   (*tempTwo).data = 12;
   (*tempTwo).next = NULL;
   head -> next -> next = tempTwo;
   delete tempTwo;






}
4

4 回答 4

4
delete temp;
delete tempTwo;

删除这些行。您正在删除分配的内存,以便下次通过您访问它head时获得segfault

您需要delete分配的内存块,这应该在您使用完内存后发生。您不需要delete触及该内存的每个变量。

在您的情况下,您可以在函数末尾创建一个循环,main逐个删除元素(您需要先保存next指针)

于 2013-07-02T06:03:44.230 回答
1

在代码中

 temp = new NodeType;
   (*temp).data = 8;
   (*temp).next = head;
   head = temp;
   delete temp;

分配的head内容被删除。所以这里head指向垃圾。所以这条线 head -> next -> next = tempTwo;会给你分段错误。您正在分配到一个无效的位置。

于 2013-07-02T06:05:27.520 回答
1

当你这样做时

head = temp; // head and temp point to same object
delete temp; // object temp points to is de-allocated

您删除指向的对象,该对象与temp指向的对象相同head。然后你head在这里取消引用:

head -> next -> next = tempTwo;

head没有指出任何有效的东西。取消引用它是未定义的行为。

于 2013-07-02T06:04:34.480 回答
0
   head = temp;
   delete temp;

-- 你删除指针并在稍后引用它

   head -> next -> next = tempTwo;
于 2013-07-02T06:04:47.670 回答