Задача
В
LinkedList(){
Node* head = NULL;
Node* tail = NULL;
}
Node* head = NULL;
говорит компилятору создать новую переменную Automatic с именем head
, которая является указателем на Node
, и установить эту новую переменную на NULL
. Это новый head
shadows LinkedList::head
, заменяющий его для остальной части конструктора. В результате head
переменная, которая существует только в теле конструктора, получает инициализацию (действительно назначение) для LinkedList::head
.
Это значит, что когда вы доберетесь до
if(head == NULL)
в createLinklist
, LinkedList::head
, вероятно, не NULL
и вместо этого указывает на дикий синий цвет, поэтому программа выполняет
insertAtEnd(node,tail);
и LinkedList::tail
постигла та же участь, что и LinkedList::head
, и, вероятно, указывает куда-то, что вы не можете безопасно написать. Возможно, в этот момент программа завершает работу, но она может перезаписать что-то еще важное и вызвать сбой программы позже, скрывая истинное местоположение ошибки.
Решение
LinkedList(){
head = NULL;
tail = NULL;
}
назначает NULL to
head and
tail`. Более идиоматический подход заключается в использовании списка инициализирующих элементов
LinkedList(): head(NULL), tail(NULL)
{
// does nothing.
}
Sidenote
хороший компилятор с включенным уровнем предупреждения предупредит вас, что
Node* head = NULL;
ничего полезного не делает. Никогда не игнорируйте предупреждения компилятора. Предупреждение компилятора означает, что, хотя ваша программа может быть синтаксически правильной, она, вероятно, не делает то, что вы хотите. Предупреждения - ваша первая линия защиты от логических ошибок. Всегда пытайтесь понять и понять, что говорит вам компилятор. Это может сэкономить вам часы отладки позже.