Вы должны использовать отладчик для просмотра вашего кода. В вашей функции
void InsertAtEnd(Node *ptr) { //we must traverse to the end
Node *temp = m_head;
while (temp != nullptr) {
temp = temp->m_next;
}
temp->m_next = ptr->m_next; // but temp is nullptr. BOOM
}
вы выполняете итерацию до тех пор, пока temp
не станет nullptr
. Но в этот момент выполнение temp->m_next
- это UB. Вы должны остановиться прямо перед этим. Кроме того, вы должны связать ptr
, а не ptr->m_next
void InsertAtEnd(Node *ptr) { //we must traverse to the end
Node *temp = m_head;
while (temp->m_next != nullptr) { // look ahead
temp = temp->m_next;
}
temp->m_next = ptr; // just ptr
}
Конечно, вам также необходимо выполнить дополнительную проверку в случае, если связанный список пуст
void InsertAtEnd(Node *ptr) { //we must traverse to the end
if (m_head == nullptr)
m_head = ptr;
else {
Node *temp = m_head;
while (temp != nullptr) {
temp = temp->m_next;
}
temp->m_next = ptr->m_next;
}
}
Вы, кажется, делаете противоположную вещь в своей функции отображения. Там вы должны выполнять итерацию, пока temp
не станет nullptr
. В противном случае вы не напечатаете последний элемент.
Также, пожалуйста, не делайте using namespace std;