C++ 所以我只是想用C++;但我似乎无法克服分割错误
我已经修复了一些问题,但仍然无法通过append函数while循环中的分段错误,在该循环中,temp的下一个被更新。当我进入特定行时,我在调试器中看到了分段错误。还有一个旁注,虽然张贴在这里,但它给出了许多错误,我可以用任何方法来修复这些错误C++ 所以我只是想用C++;但我似乎无法克服分割错误,c++,C++,我已经修复了一些问题,但仍然无法通过append函数while循环中的分段错误,在该循环中,temp的下一个被更新。当我进入特定行时,我在调试器中看到了分段错误。还有一个旁注,虽然张贴在这里,但它给出了许多错误,我可以用任何方法来修复这些错误 #include <iostream> using namespace std; class node{ public: int data; node* next; node() { data
#include <iostream>
using namespace std;
class node{
public:
int data;
node* next;
node()
{
data=0;
next=nullptr;
}
node(int value)
{
data=value;
}
void setnext(node* obj)
{
next=obj;
}
};
class linkedlist{
public:
node* head;
node* tail;
linkedlist()
{
head=nullptr;
tail=nullptr;
}
void prepend(int data)
{
node* temp=new node(data);
temp->setnext(head); //updates the new next pointer
head=temp; //updates the head with new address
}
void append(int data)
{
node* temp=new node(data);
if(head==nullptr)
{
cout<<"the linked list is empty";
head=temp;
tail=temp;
temp=nullptr;
}
else {
while (temp!= nullptr)
{
temp = temp->next; //segmentation fault here
}
tail->setnext(temp);
tail = temp; //updates the tail with new address
}
}
void display()
{
node* temp=head;
while(temp!=nullptr)
{
cout<<temp->data<<"->";
temp=temp->next;
}
cout<<"NULL";
}
};
int main()
{
linkedlist obj;
obj.prepend(1);
obj.append(2);
obj.append(3);
obj.display();
}
#包括
使用名称空间std;
类节点{
公众:
int数据;
节点*下一步;
节点()
{
数据=0;
next=nullptr;
}
节点(int值)
{
数据=价值;
}
void setnext(节点*obj)
{
next=obj;
}
};
类链接列表{
公众:
节点*头;
节点*尾部;
linkedlist()
{
水头=零PTR;
tail=nullptr;
}
无效预结束(整型数据)
{
节点*临时=新节点(数据);
temp->setnext(head);//更新新的下一个指针
head=temp;//用新地址更新head
}
无效附加(整型数据)
{
节点*临时=新节点(数据);
if(head==nullptr)
{
coutsetnext(临时);
tail=temp;//用新地址更新tail
}
}
无效显示()
{
节点*温度=头部;
while(temp!=nullptr)
{
在为“tail”成员赋值之前,不能在append()函数中使用它。在创建新的linkedlist
后,linkedlist
的默认构造函数应已将node*head
和node*tail
初始化为nullptr
因此,obj.prepend(1);linkedlist obj;
之后的调用obj.prepend(1);
不会将1
前置到obj
。因此,node*head
和node*tail
仍然是nullptr
之后,如果调用obj.append(2);
,则tail->setnext(temp);
会导致分段错误,因为tail
是nullptr
您应该在linkedlist::prepend
和linkedlist::append
中检查linkedlist是否为空,如果为空,则需要正确初始化node*head
和node*tail
。void*setnext(node*obj)
不返回任何内容,这是未定义的行为。您应该打开编译器警告并修复它们。您不应该将其注释掉://next=nullptr;
节点(int值)
构造函数不会初始化next
,因此以后读取它也是未定义的行为。实际上,您的代码有许多未初始化的指针。始终初始化构造函数中的成员。当指针未初始化时,检查NULL
没有帮助(顺便说一句,请使用NULL ptr
)此代码有很多问题。未初始化的成员、缺少必要的功能(例如,如果没有,则您从未实际设置头部),或者像data='\0'
这样的奇怪初始化成员,其中data
的类型为int
(那么为什么不使用data=0
?)。我上传了一个编辑过的代码,其中我已经修复了一些错误。prepend现在似乎工作正常。您能否指出是什么原因导致了分段错误(代码中提到的行)?1.在void prepend(int data)中,您忘记了设置node*tail,如果它是null ptr。2.在void append(int data)中,while的目的是什么(temp!=nullptr)循环?1.在这种情况下我没有设置它,因为我只是将头部设置为一个新节点。2.这个while循环的目的是遍历节点直到到达尾部。我做了另一个更改:while(temp->next!=nullptr)