我正在尝试在链表的末尾插入一个新节点。但是,当我尝试时,我会在插入点处出现分段错误。我知道首选方法是'head - >下一个'风格,但对于任务,我们长期坚持做。帮助
谢谢!
#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;
}
答案 0 :(得分:4)
delete temp;
delete tempTwo;
删除这些行。您正在删除分配的内存,以便下次通过head
访问时获得 segfault 。
你需要delete
你分配的内存块,这应该在你完成内存使用后发生。您不需要delete
每个接触该内存的变量。
在你的情况下,你可以在main
函数的末尾创建一个循环,逐个删除元素(你需要先保存next
指针)
答案 1 :(得分: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
并未指出任何有效的内容。取消引用它是未定义的行为。
答案 2 :(得分:1)
在代码中
temp = new NodeType;
(*temp).data = 8;
(*temp).next = head;
head = temp;
delete temp;
删除分配给head
的内容。所以这里head
指向垃圾。因此,行head -> next -> next = tempTwo;
会为您提供细分错误。您正在分配无效的位置。
答案 3 :(得分:0)
head = temp;
delete temp;
- 您删除指针并稍后将其推迟
head -> next -> next = tempTwo;