Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/139.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 所以我只是想用C++;但我似乎无法克服分割错误_C++ - Fatal编程技术网

C++ 所以我只是想用C++;但我似乎无法克服分割错误

C++ 所以我只是想用C++;但我似乎无法克服分割错误,c++,C++,我已经修复了一些问题,但仍然无法通过append函数while循环中的分段错误,在该循环中,temp的下一个被更新。当我进入特定行时,我在调试器中看到了分段错误。还有一个旁注,虽然张贴在这里,但它给出了许多错误,我可以用任何方法来修复这些错误 #include <iostream> using namespace std; class node{ public: int data; node* next; node() { data

我已经修复了一些问题,但仍然无法通过append函数while循环中的分段错误,在该循环中,temp的下一个被更新。当我进入特定行时,我在调试器中看到了分段错误。还有一个旁注,虽然张贴在这里,但它给出了许多错误,我可以用任何方法来修复这些错误

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