所以这是用于将新元素插入链表的代码。它需要插入第一个节点的地址和整数数据。但是当我返回第一个节点的地址时,我收到了Segfault。我已经阅读了其他类似的问题,但是OP正在返回一个指向局部变量的指针。在这里,我实际上返回了一个本地指针。
struct Node
{
int data;
struct Node *next;
}
Node* Insert(Node *head,int data)
{
Node* temp=head;
Node* return_value=temp;
cout<<head<<" ";
while(temp!=NULL && temp->next!=NULL)
{
temp=temp->next;
}
Node new_obj;
if(temp==NULL)
{
temp=&new_obj;
temp->data=data;
cout<<temp<<" "<<temp->data<<" ";
return(temp);
}
答案 0 :(得分:3)
Node new_obj
在堆栈上创建一个对象,而不是堆。当Insert
退出时,该对象不再存在。您需要temp = new Node;
而不是temp=&new_obj;
。
编辑此外,如果列表非空,则while
循环将temp
指向列表的非NULL最后一个节点。因此,您实际上不会分配新节点,因为if(temp==NULL)
检查将失败!
编辑2 return temp;
就好了。要修复段错误,只需要更改新节点的创建。对于while
错误,有很多方法可以解决它。一种选择是查找有关列表的“标题节点”的信息。另一种方法是首先测试head==NULL
并单独处理。