![]() |
Модераторы: bsa |
![]() ![]() ![]() |
|
sswt |
|
|||
Новичок Профиль Группа: Участник Сообщений: 41 Регистрация: 22.9.2015 Репутация: нет Всего: нет |
feodorv,
как то так, я уже запуталась, поэтому если дурню пишу извините) |
|||
|
||||
feodorv |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 12 Всего: 45 |
И жутко не нравится это free(). Почему не new+delete?
Добавлено через 4 минуты и 19 секунд Дурните. Я Вам привел правильный и лаконичный вариант. Почему бы не подумать над ним хоть немножко? Зачем Вы опять разименовываете firstNode до проверки? Почему не проверяете secondNode на nullptr? Почему делаетев случае, когда нулевой firstNode (а в этом случае вообще ничего делать не нужно - с Вас объяснение, почему так)???????????????????????????????????????????????????????????????????????????????? -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
|||
|
||||
sswt |
|
||||||||
Новичок Профиль Группа: Участник Сообщений: 41 Регистрация: 22.9.2015 Репутация: нет Всего: нет |
free та как я на Си пишу.... Но я же посмотрела как вы тут сделали и так само написала
Это сообщение отредактировал(а) sswt - 28.10.2015, 17:38 |
||||||||
|
|||||||||
feodorv |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 12 Всего: 45 |
Вы в этом уверены? Можно посмотреть Ваше определение DoublyLinkedList и DoublyLinkedList::Node? Послушайте. Вы мне напоминаете маленького ребёнка, которого заставили собирать пазл. И вот он попеременно с силой вставляет один неподходящий элемент мозаики в другой и удивляется, почему не получается цельной картины? Всё же программирование лежит в иной плоскости. С одной стороны, это творчество, что Вам пытался донести math64, предлагая несколько вариантов подхода к решению этой незатейливой задачи. С другой стороны - это ясное понимание того, что должно происходить в Вашей программе. Это и логика, это и обработка особых ситуаций, это адекватная реакция программы на любые входные данные. И многое чего ещё. Но это не перебор пазлинок, авось повезёт на этот раз и всё заработает, и заработает правильно. У Вас на руках в функции RemoveAfter всего три элемента: node, firstNode, secondNode (и гдет-то на заднем фоне маячит tail). Они взаимосвязаны друг с другом через поля nextNode и prevNode. Абсолютно ничего не мешает Вам взять бумагу и зарисовать эти взаимосвязи. А потом зарисовать то, что должно получиться при выдёргивании из этой цепочки срединного члена - firstNode. А потом рассмотреть случай, когда firstNode есть нулевой указатель. Что поменяется в коде в этом случае? Когда нужно проверить firstNode на nullptr, куда в код вставить эту проверку, чтобы не было разименовывания нулевого указателя. Меняется ли в этом случае tail и/или nextNode/prevNode у наших трёх элементов? А затем рассмотреть случай, когда secondNode есть нулевой указатель (ведь такое может случиться, правда ведь?) Аналогичные вопросы. Я Вас очень попрошу в устной форме прямо в этой ветке на них ответить. Только тогда Вам станет ясно, что не так в том коде, который Вы привели и который, по Вашему утверждению, Вы сделали после "посмотрела как вы тут сделали". И почему я должен по десять раз повторять, что:
Я Вам написал, и ещё раз напишу: Вообще, вся логика по проверке на нулевые указатели нарушена полностью (заодно и логика алгоритма). secondNode тоже может быть нулевым указателем, тогда делать secondNode->prevNode никак нельзя. Если уж Вам так не нравится конструкция node->nextNode->prevNode, то реализовывайте её последовательно:
Соглашаться на этот код Вам не обязательно, но с Вас объяснение того, что должно происходить в коде при:
-------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
||||
|
|||||
math64 |
|
||||||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 12 Всего: 72 |
Как можно видеть RemoveFirst и RemoveAfter очень похожи. В RemoveAfter нужно внести только 2 изменения, чтобы она могла удалять и первый элемент списка:
Или даже так:
Но это менее понятно Добавлено через 6 минут и 12 секунд
Это C++. На C будет
Чтобы код работал как на C, так и на C++, нельзя объявлать структуру в структуре и нужно не забывать ключевое слово struct. |
||||||||
|
|||||||||
feodorv |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 12 Всего: 45 |
Да и вообще, для двусвязного списка делить узлы на "первый" и "следующий" весьма странно (для односвязного - нормально). Достаточно просто функции removeNode, которая удаляет из списка именно тот node, который и передаётся функции removeNode. И уже внутри себя функция removeNode определяет, первый ли это элемент в списке, последний ли или ещё как-то. Для C придётся ещё избавляться от nullptr. -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
|||
|
||||
math64 |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 12 Всего: 72 |
||||
|
||||
sswt |
|
||||
Новичок Профиль Группа: Участник Сообщений: 41 Регистрация: 22.9.2015 Репутация: нет Всего: нет |
math64, аможете обяснить вот это:
Как я уже писала я на Си пишу
|
||||
|
|||||
math64 |
|
||||||||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 12 Всего: 72 |
Это - C++.
Надо так:
(с учетом того, чтобы можно было компилироваться как в C, так и в C++) В C есть оператор ?: поэтому можно писать
Это эквивалентно:
А вот вместо
Придётся писать
Это сообщение отредактировал(а) math64 - 29.10.2015, 10:30 |
||||||||||
|
|||||||||||
sswt |
|
|||
Новичок Профиль Группа: Участник Сообщений: 41 Регистрация: 22.9.2015 Репутация: нет Всего: нет |
math64, спасибо. Буду знать
Добавлено @ 10:40 math64, я написала :
но бага так и есть( как вы можете увидеть на картинке Это сообщение отредактировал(а) sswt - 29.10.2015, 10:42 Присоединённый файл ( Кол-во скачиваний: 3 ) ![]() |
|||
|
||||
math64 |
|
||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 12 Всего: 72 |
Вместо firstNode = secondNode; нужно писать:
Сокращенная запись возможно только с firstNodeRef или firstNodePtrPtr (если пишете на C):
|
||||
|
|||||
sswt |
|
|||
Новичок Профиль Группа: Участник Сообщений: 41 Регистрация: 22.9.2015 Репутация: нет Всего: нет |
Я надеюсь я хоча б эти функци правильно сделала?
Выводит нормально..... Это сообщение отредактировал(а) sswt - 29.10.2015, 12:45 |
|||
|
||||
math64 |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 12 Всего: 72 |
Правильно. Но в C нельзя объявлять переменую цикла в for:
|
|||
|
||||
sswt |
|
|||
Новичок Профиль Группа: Участник Сообщений: 41 Регистрация: 22.9.2015 Репутация: нет Всего: нет |
а можете пример скинуть реализации этой функции? Если есть в интернете |
|||
|
||||
volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 16 Всего: 85 |
|
|||
|
||||
![]() ![]() ![]() |
Правила форума "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. |