Нарушение прав доступа при чтении C++

Посмотрел уже кучу тредов по поводу этой ошибки, но не могу понять, что не так у меня, ведь я, вроде делаю все необходимые проверки на наличие пустых указателей. В моей программе я создаю список. Соответственно, чтобы двигаться по элементам мои списка я использую привычную и стандартную конструкцию

Node *nx = head;
while(nx->next!=NULL){
nx = nx->next;
}

Однако, как только я пишу этот блок, то программа выдает ошибку во время исполнения, пишет, что обнаружено необработанное исключение и нарушение прав доступа. Однако, почему так происходит понять не могу - вроде все проверки на "NULL" у меня есть и обращения к пустому указателю не должно никак происходить.

#ifndef LIST_H
#define LIST_H
#include "Triangle.h"
struct Node {
    Triangle tri;
    Node* next;
    Node* prev;
};
class List {
public:
    Node* head;
    List();
    void AddElem();
    //void DeleteElem(int i);
    //void GetElem(int i);
    //~List();
    friend std::ostream& operator<<(std::ostream& out, List& d);
};
#endif

Вот ошибка происходит на строчке с while

List::List() {
    head = NULL;
}
void List::AddElem() {
    struct Node* elem = (Node*)(malloc(sizeof(struct Node)));
    std::cin >> elem->tri;
    if (head == NULL) {
        head = elem;
    }
    /*else {
        Node* nx = head;
        //if (nx != NULL) {
            while (nx->next != NULL &&  nx!= NULL) { // здесь тоже ругается 
                nx = nx->next;
            }
            nx->next = elem;
            elem->prev = nx;
        
    }
    */
}
std::ostream& operator<<(std::ostream& out, List& d) {
    if (d.head != NULL) {
        struct Node* nx = d.head;
        while (nx != NULL && nx->next != NULL) { // ошибка здесь 
            out << nx->tri << "\n";
            if (nx->next != NULL) {
                nx = nx->next;
            }
        }
    }
    return out;
}

В чем проблема?


Ответы (2 шт):

Автор решения: Qwertiy
Node *nx = head;
while(nx->next!=NULL){
nx = nx->next;
}

Подозреваю, что не хватает проверки, что сам указатель NULL:

Node *nx = head;

if (nx)
  for(; nx->next; nx = nx->next)
    ;
→ Ссылка
Автор решения: lightning

Проблема найдена и решена - ошибка в том, что я не инициализировал указатели next и prev и они были не определены. необходимо добавить

elem->next = NULL;
nx ->next = head->next
→ Ссылка