Круговой связанный список

Контекст: создайте круговой двусвязный список из файла (input.txt), содержащего список имен. Количество имен неизвестно.

Запросите у пользователя количество узлов, которые нужно удалить, а затем удалите соответственно из списка.

Предположение: число, введенное пользователем, не будет превышать фактическое количество узлов в списке.

Вопрос: Моя функция удаления узла не работает, так как, когда я показываю, что находится в узле, который предположительно был удален, данные все еще там. Любая помощь?

Мой код: http://www.cplusplus.com/forum/general/210015/

(Я ссылаюсь на этот другой веб-сайт, потому что там было проще форматировать.)

0

Решение

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

Доступ к уничтоженному (удаленному) объекту имеет неопределенное поведение.

Ты не можешь ожидать как ведет себя программа, когда поведение не определено. Поэтому ваш ожидание тот «данных не должно быть» был необоснованным. Правильным ожиданием является то, что данные могут или не могут быть там, и что программа может или не может аварийно завершить работу, и что демоны могут или не могут вылететь из носа пользователя.

2

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

Вопрос был решен в ссылке. Спасибо, парни!

1

Ваш код для void deleteNode(struct node *&head) есть много ошибок.

  1. Вы не проверяете, если head является нулевым
  2. Вы не проверяете, если current->next и / или current->prev являются nullptr

доступ к указателям nullptr — неопределенное поведение, которое может означать сбой или неожиданные результаты или что-то еще.

0

Попробуйте использовать следующую функцию удаления, чтобы удалить узел.
Примечание: при условии, что удаление начинается с головы.

  void deleteNode(struct node *&head,int deleteCount)
{
if(head != NULL){
struct node *current=head; //copy of head.
struct node *temp,*headPrev,*headNext;
headPrev = head->prev;
headNext = head->next;
int count = 0;
while(count++ < deleteCount)
{
//add code to free current node from me
temp = current; //get rid of this node
currrent = current->next; //skip all the nodes you want delete
}
current->prev = headPrev;
headPrev->next = current;
head = current;
}
}
0