EXC_BAD_ACCESS Ошибка при использовании связанного списка

Моя программа все еще компилирует и печатает из введенных файлов данных. Тем не менее, ошибка все еще происходит после того, как все напечатано, и поэтому программа не заканчивается чисто.

Я получаю сообщение об ошибке именно в этой части моей программы

while (current->next != tail)

В основном эта программа использует связанный список для хранения информации и вывода ее на экран. Моя конкретная ошибка связана с функцией clear (), которая должна очистить весь связанный список с помощью функции pop_back ().

//removes the last object from the linked list – deallocates memory
template <typename T>
void LL<T>::pop_back()
{

if(count==0)
{
//Do nothing. Nothing to remove.
return;
}
else{
Node<T> *current;
current=head;

while (current->next != tail)
{
current=current->next;

}

delete tail;
tail=current;

count--;
}
}

//Clears the linked list
template <typename T>
void LL<T>::clear()
{
Node<T> *current= head;while (current != NULL)
{
pop_back();
//current=tail;
}
current=tail;

head=tail=NULL;

}

Любая помощь приветствуется.

0

Решение

Ваш метод pop_back не обрабатывает случай, когда хвост и голова — это один и тот же элемент (или связанный список из 1 элемента). Как быстрое решение, может быть, дополнительная проверка для этого случая?

if(count==0)
{
//Do nothing. Nothing to remove.
return;
}
else if (count==1)
{
head = tail = NULL;
count--;
return;
}

Также этот цикл бесконечен как написано:

while (current != NULL)
{
pop_back();
//current=tail;
}

может быть while (head != NULL) или же while (count != 0)?

0

Другие решения

Вам необходимо обновить узел перед удалением. Вот упрощенная версия вашего pop_back() метод:

template <typename T>
void LL<T>::pop_back()
{
Node<T> curr = head;
Node<T> prev = NULL;

while(curr != NULL && curr->next != NULL) // I'm assuming your tail's value is NULL
{
prev = curr;
curr = curr->next;
}

if(curr != NULL)
{
if(prev != NULL)
prev->next = NULL;
delete curr;
--count;
if(count == 0)
head = NULL;
}
}

Я не скомпилировал код, но думаю, идея ясна.

Кстати, вы можете улучшить производительность clear() метод:

Node<T> curr = head;
while(curr != NULL)
{
Node<T> tmp = curr->next;
delete curr;
curr = tmp;
}

head = NULL;
tail = NULL;
count = 0;
0

По вопросам рекламы [email protected]