Обе функции AddHead
и AddTail
имеют серьезную ошибку, поскольку выделенный узел сразу удаляется
head = tempRef;
delete tempRef;
и
tail = tempRef;
delete tempRef;
Таким образом, указатели головы и хвоста имеют недопустимые значения.
Кроме того, функции не обновляют tail
и head
соответственно в каждой функции.
И первоначально оба указателя равны nullptr
. Таким образом, эти операторы
head->prev = tempRef;
и
tail->next = tempRef;
приводят к неопределенному поведению.
Функция AddHead
может быть определена следующим образом
template <typename T>
void LinkedList<T>::AddHead(const T& data) {
NODE tempRef = new Node(data, nullptr, head);
if ( head == nullptr )
{
head = tail = tempRef;
}
else
{
head = head->prev = tempRef;
}
count++;
}
И функция AddTail
может выглядеть следующим образом:
template <typename T>
void LinkedList<T>::AddTail(const T& data) {
NODE tempRef = new Node(data, tail, nullptr);
if ( tail == nullptr )
{
tail = head = tempRef;
}
else
{
tail = tail->next = tempRef;
}
count++;
}
Конструктор копирования (и оператор присваивания копии) либо должен быть определен как удаленный, либо должен сделать глубокую копию списка, переданного в качестве аргумента. .
В противном случае два списка будут пытаться удалить одни и те же узлы два раза (в забытом вами деструкторе).
Структура Node
должна быть объявлена как член частного класса.