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