C++ C+中的分段错误+;在打印链表元素时

C++ C+中的分段错误+;在打印链表元素时,c++,class,linked-list,singly-linked-list,definition,C++,Class,Linked List,Singly Linked List,Definition,请帮忙。当我试图打印此链接列表中的元素时,我遇到了分段错误。 我首先声明一个类和一个函数来插入和显示列表中的元素,这些都是它的函数。 代码: #包括 使用名称空间std; 结构节点{ int数据; 节点*下一步; }; ll班{ 节点*头,*尾; 公众: 无效推送(整数x){ node*temp=新节点; 温度->数据=x; temp->next=NULL; if(head==NULL){ 压头=温度; 尾=温度; } 否则{ 尾部->下一步=温度; 尾=温度; } } 无效显示(){ 节点*n

请帮忙。当我试图打印此链接列表中的元素时,我遇到了分段错误。 我首先声明一个类和一个函数来插入和显示列表中的元素,这些都是它的函数。 代码:

#包括
使用名称空间std;
结构节点{
int数据;
节点*下一步;
};
ll班{
节点*头,*尾;
公众:
无效推送(整数x){
node*temp=新节点;
温度->数据=x;
temp->next=NULL;
if(head==NULL){
压头=温度;
尾=温度;
}
否则{
尾部->下一步=温度;
尾=温度;
}
}
无效显示(){
节点*n=头部;
while(n!=NULL){

cout问题是在创建列表时,您没有将
head
设置为
NULL
。同样的问题也适用于
tail
。这是构造函数的工作

class ll {
    node *head,*tail;
public:
    ll() { head = tail = NULL; }
    void push(int x) {
        ...

数据成员头和数据成员尾都不是由nullptr初始化的,因此程序具有未定义的行为

您可以在类定义中写入

class ll{
node *head = nullptr, *tail = nullptr;
//...
请记住,结构节点应该是类
ll
的成员

class ll{
    struct node{
       int data;
        node *next;
     } *head = nullptr,*tail = nullptr;

public:
    void push( int x ){
        node *temp = new node { x, nullptr };
        if( head == NULL ){
            head = tail = temp;
        }
        else {
            tail = tail->next = temp;
        }
    }
    //...
class ll{
    struct node{
       int data;
        node *next;
     } *head,*tail;

public:
    ll() : head( nullptr ), tail( nullptr ) {}
    // ...
class ll{
    struct node{
       int data;
        node *next;
     } *head,*tail;

public:
    ll() : head( nullptr ), tail( nullptr ) {}
    ~ll() { /* must be defined */ }
    ll( const LL & ) = delete;
    ll & operator =( const ll & ) = delete;
    // ...
您可以在默认构造函数中初始化数据成员,而不是在类定义中初始化数据成员,例如

class ll{
    struct node{
       int data;
        node *next;
     } *head = nullptr,*tail = nullptr;

public:
    void push( int x ){
        node *temp = new node { x, nullptr };
        if( head == NULL ){
            head = tail = temp;
        }
        else {
            tail = tail->next = temp;
        }
    }
    //...
class ll{
    struct node{
       int data;
        node *next;
     } *head,*tail;

public:
    ll() : head( nullptr ), tail( nullptr ) {}
    // ...
class ll{
    struct node{
       int data;
        node *next;
     } *head,*tail;

public:
    ll() : head( nullptr ), tail( nullptr ) {}
    ~ll() { /* must be defined */ }
    ll( const LL & ) = delete;
    ll & operator =( const ll & ) = delete;
    // ...
另外,您至少需要定义析构函数,或者显式定义复制构造函数和复制赋值构造函数,或者将它们定义为已删除

class ll{
    struct node{
       int data;
        node *next;
     } *head = nullptr,*tail = nullptr;

public:
    void push( int x ){
        node *temp = new node { x, nullptr };
        if( head == NULL ){
            head = tail = temp;
        }
        else {
            tail = tail->next = temp;
        }
    }
    //...
class ll{
    struct node{
       int data;
        node *next;
     } *head,*tail;

public:
    ll() : head( nullptr ), tail( nullptr ) {}
    // ...
class ll{
    struct node{
       int data;
        node *next;
     } *head,*tail;

public:
    ll() : head( nullptr ), tail( nullptr ) {}
    ~ll() { /* must be defined */ }
    ll( const LL & ) = delete;
    ll & operator =( const ll & ) = delete;
    // ...

<代码>节点*>;< /COD>不会初始化头到空。有时C++实现将是零变量,但这是不应该依赖的特性。在C++中使用<代码> null <代码>是不好的实践,这也不使用初始化列表,并且它将更为透明。values@LonesomeParadiseOP使用了
NULL
和needs首先要了解构造函数,初始化列表将在稍后介绍。我在这个网站上的理念是,对于完全初学者,最好一次只关注一件事。@john Ok,但OP在他们的代码中实际上没有使用构造函数,因此这两者都引入了他们可能不熟悉的东西(构造函数)并展示了一种使用它们的方法,这是一种不好的做法,也是无效的