![]() |
Модераторы: bsa |
![]() ![]() ![]() |
|
sswt |
|
|||
Новичок Профиль Группа: Участник Сообщений: 41 Регистрация: 22.9.2015 Репутация: нет Всего: нет |
У меня проблема: когда я вывожу значения printBackward послу удаления головы или следущего значения у меня бага сплывает, printForward нормально выводит подскажите где ошибка. Тоесть когда я с хвоста начинаю читать бага появляеться
|
|||
|
||||
math64 |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 12 Всего: 72 |
При удалении элементов RemoveFirst и RemoveAfter не проверяешь, пустой ли список.
Нужно также проверить, удаляется ли последний элемент и поправить list->tail если нужно. |
|||
|
||||
sswt |
|
|||
Новичок Профиль Группа: Участник Сообщений: 41 Регистрация: 22.9.2015 Репутация: нет Всего: нет |
math64,
Это сообщение отредактировал(а) sswt - 28.10.2015, 13:11 |
|||
|
||||
feodorv |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 12 Всего: 45 |
Так намёк же - посмотреть, где не правится значение prevNode. Ну, вот здесь правится:
А здесь вообще никак:
Это сообщение отредактировал(а) feodorv - 28.10.2015, 13:30 -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
||||
|
|||||
sswt |
|
|||
Новичок Профиль Группа: Участник Сообщений: 41 Регистрация: 22.9.2015 Репутация: нет Всего: нет |
feodorv, можете написать как нужно для RemoveFirst, а то я запуталась немножко(((
|
|||
|
||||
math64 |
|
||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 12 Всего: 72 |
Не break, а return.
Прежде, чем делать list->head->prevNode = nullptr; нужно проверить list->head != nullptr; Аналогичные изменения в RemoveAfter. Возможны ошибки в невыложенной части кода. Добавлено через 7 минут и 7 секунд
|
||||
|
|||||
sswt |
|
|||
Новичок Профиль Группа: Участник Сообщений: 41 Регистрация: 22.9.2015 Репутация: нет Всего: нет |
math64, не помогло(
|
|||
|
||||
feodorv |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 12 Всего: 45 |
Думаю, как-то так:
-------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
||||
|
|||||
sswt |
|
|||
Новичок Профиль Группа: Участник Сообщений: 41 Регистрация: 22.9.2015 Репутация: нет Всего: нет |
feodorv, спасибо
Добавлено через 2 минуты и 24 секунды feodorv, у нас тут list нету, откуда вы берету переменую tail = node; ???? |
|||
|
||||
feodorv |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 12 Всего: 45 |
Ааааа. А я было подумал, что:
А так-то да, лист в аргументы добавить придётся. А если у Вас там ещё head и tail приватные, то придётся браться за голову))) -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
||||
|
|||||
math64 |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 12 Всего: 72 |
Либо 1) RemoveAfter(DoublyLinkedList::Node* node) будет методом класса DoublyLinkedList,
либо 2) в DoublyLinkedList::Node нужно добавить поле DoublyLinkedList* list, либо 3) нужно добавить параметр в RemoveAfter(DoublyLinkedList* list, DoublyLinkedList::Node* node); Лучше сделать 1) и 2) одновременно и добавить проверку, что node принадлежит нужному списку. |
|||
|
||||
sswt |
|
|||
Новичок Профиль Группа: Участник Сообщений: 41 Регистрация: 22.9.2015 Репутация: нет Всего: нет |
math64,
|
|||
|
||||
math64 |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 12 Всего: 72 |
В обоих случаях нужна проверка firstNode != nullptr.
В RemoveAfter ты заводишь secondNode, но нигде его не используешь (можно сделать как в RemoveFirst). list != nullptr можешь проверять, а можешь нет - если это гарантировано при вызове. Добавлено через 4 минуты и 51 секунду Кстати можно сделать
и проверять в RemoveAfter на node == nullptr - в этом случае удалять первый элемент списка, код получается похожим. К сожалению, в RemoveAfter нет контроля, что node принадлежит нужному списку. |
|||
|
||||
sswt |
|
|||
Новичок Профиль Группа: Участник Сообщений: 41 Регистрация: 22.9.2015 Репутация: нет Всего: нет |
math64, так ? та нет лутче поддельности 2 функции делать
|
|||
|
||||
feodorv |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 12 Всего: 45 |
Выглядит ужасно. Сначала Вы разименовываете указатель, а затем проверяете, не нулевой ли он. Нужно наоборот. Добавлено через 7 минут и 33 секунды Вообще, вся логика по проверке на нулевые указатели нарушена полностью (заодно и логика алгоритма). secondNode тоже может быть нулевым указателем, тогда делать secondNode->prevNode никак нельзя. Если уж Вам так не нравится конструкция node->nextNode->prevNode, то реализовывайте её последовательно:
-------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
||||
|
|||||
![]() ![]() ![]() |
Правила форума "C/C++: Для новичков" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |