Ошибка сегментации в C ++ при печати элементов связанного списка - PullRequest
0 голосов
/ 15 апреля 2020

пожалуйста, помогите. Я получаю ошибку сегментации, когда пытаюсь напечатать элементы в этом связанном списке. Сначала я объявляю класс, а функция для вставки и отображения элементов списка - это его функции. код:

#include <iostream>
using namespace std;
struct node{
int data;
node *next;
 };
class ll{
node *head,*tail;
public:
void push(int x){
node *temp = new node;
temp->data = x;
temp->next = NULL;
if(head == NULL){
    head = temp;
    tail= temp;
}
else{
    tail->next = temp;
    tail= temp;

}
        }
void show(){
    node *n = head;
    while(n!=NULL){
        cout<<n->data<<"\n";
        n = n->next;
         }
  }

};
int main()
 {
ll a;
a.push(1);
a.push(2);
a.show();
return 0;
  }

Ответы [ 2 ]

2 голосов
/ 15 апреля 2020

Ни заголовок элемента данных, ни хвост элемента данных не инициализируются 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;
    // ...
0 голосов
/ 15 апреля 2020

Проблема в том, что вы не устанавливаете head в NULL при создании списка. Та же проблема относится к tail. Это работа для конструктора

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