I created a doubly-linked list in C++. Everything works great if I insert a node at the beginning of the list or if I just insert a node at the end of the list; but, when I insert a node at the beginning and then try to insert a node at the end, I get a null pointer error!
Here is the code and the problem is in the InserAtEnd function
#include <iostream>
using namespace std;
struct Node {
    int data;
    Node* prev;
    Node* next;
};
struct MyList {
    Node* head;
    Node* tail;
};
bool IsEmpty(MyList list) {
    if (list.head == nullptr) return true;
    else return false;
}
void Insert(MyList& list, int data) {
    Node* node = new Node();
    node->data = data;
    node->prev = nullptr;
    node->next = list.head;   //node->next points to NULL
    if (list.head == nullptr) {
        list.head = node;
        node->prev = nullptr;
    }
    else {
        //insert the new node at the beginning of the list
        list.head->prev = node;
        list.head = node;
        node->prev = nullptr;
    }
}
// Insert node at end of list
void InsertAtEnd(MyList& list, int data) {
    Node* node = new Node();
    node->data = data;
    node->next = nullptr;
    node->prev = nullptr;
    if (list.head == nullptr) { // Empty list
        list.head = node;
        list.tail = node;
    }
    else {
        list.tail->next = node;
        node->prev = list.tail;
        list.tail = node;
    }
}
//Traverse the list from the head
void PrintAll(const MyList& list) {
    Node* temp = list.head;
    if (temp == nullptr) {
        cout << "list is empty" << endl;
    }
    else {
        while (temp != nullptr)
        {
            cout << temp->data << endl;
            temp = temp->next;
        }
        cout << "*************************************" << endl;
    }
}
Node* Search(const MyList& list, int key) {
    Node* temp = list.head;
    while (temp != nullptr && temp->data != key)
    {
        temp = temp->next;
    }
    return temp;
}
void Delete(MyList& list, int key) {
    Node* temp = Search(list, key); //call search() 
    if (temp != nullptr)
    {
        if (temp->prev != nullptr)
        {
            temp->prev->next = temp->next;
        }
        else
        {
            list.head = temp->next;
        }
        if (temp->next != nullptr)
        {
            temp->next->prev = temp->prev;
        }
    }
}
int main() {
    MyList list;
    list.head = nullptr;    //initialize the linked-list
    list.tail = nullptr;
    if (IsEmpty(list)) 
        cout << "List is empty" << endl;
    Insert(list, 10);
    PrintAll(list);
    /*
    Insert(list, 20);
    Insert(list, 30);
    Insert(list, 40);
    */
    // Insert at end
    cout << "Now insert at end" << endl;
    InsertAtEnd(list, 70);
    InsertAtEnd(list, 45);
    InsertAtEnd(list, 59);
    InsertAtEnd(list, 12);
    InsertAtEnd(list, 33);
    PrintAll(list);
    
    /*
    int x = 24;
    Node* result = Search(list, x);
    if (result == nullptr) cout << "Cannot find " << x << endl;
    else cout << "Found " << result->data << endl;
    Delete(list, 200);
    PrintAll(list);
    Delete(list, 10);
    PrintAll(list);
    Delete(list, 40);
    PrintAll(list);
    Delete(list, 20);
    PrintAll(list);
    Delete(list, 30);
    PrintAll(list);
    */
    return 0;
}
 
     
    