Есть три важные ошибки:
push () --- исправлено
void push(Node* node)
{
if(firstNode == NULL)
{
firstNode = node;
currentNode = node;
// firstNode->next = currentNode; --> this does nothing useful!
size++;
}
else
{
currentNode->next = node;
currentNode = node;
//currentNode = node; -|
//currentNode = currentNode->next; -|----> why? what? Do explain.
size++;
}
}
Я думаю, назначив firstNode->next = currentNode;
, вы ожидали, когда в следующий раз currentNode
будет обновлено, этотакже обновит firstNode->next
.
Это не сработает.
firstNode->next = currentNode;
подразумевает, что адрес, сохраненный в currentNode
, теперь находится в firstNode->next
.Поэтому в следующий раз, когда вы сохраняете что-то в currentNode = node;
, вы не сохраняете это в firstNode->next
.Итак, у вас есть неверный связанный список - вот почему ваш вывод не зашёл слишком далеко.
Кроме того, это действительно плохо .Установив currentNode=node
перед , установив указатель next
текущего узла на node
, вы снова разбили список.Сначала вы должны указать currentNode->next
на node
, а затем установить currentNode
как node
(node
- это узел, который вы помещаете в свой список).
Node val = Node (i);
Область действия val
находится только в пределах этой итерации вашего цикла.Как только вы зациклились, он покинул стек и больше не существует.Но вы скопировали указатель val в свой список - так что теперь с правильным методом push
вы просто добавляете висячий указатель.
Node *val = new Node(i);
ll.push(val);
Вам нужно положить его в кучу, чтобы он оставался включенным, пока он вам больше не нужен.
... что ведет нас к вашему деструктору!
Поскольку вы выделили узел, вам нужно освободить его.Так что сделайте это в своем деструкторе - пройдитесь по списку и освободите все эти узлы.