![]() |
Модераторы: bsa |
![]() ![]() ![]() |
|
Creder |
|
|||
Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 9.5.2015 Репутация: нет Всего: нет |
Здравствуйте. Такой вопрос.
Используя классы, создать упорядоченное бинарное дерево, которое описывает справочник файлов в файловой системе. Каждому узлу соответствует некоторый файл , в узле содержится имя файла и дата последнего обращения к нему. Узлов в дереве не менее 15. Реализовать функцию, которая удаляет из дерева все файлы(узлы), обращение к которому было произведено до даты, введённой с клавиатуры. Исходное и результирующее дерево вывести на экран. Проблема заключается в создании функции удаления тех самых узлов. Не знаю, что делать. Помогите, пожалуйста.
|
|||
|
||||
feodorv |
|
||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 12 Всего: 45 |
Помимо этой проблемы в приведённой программе есть ещё. Например:
char name - это один единственный символ, никак не имя файла (которое есть набор символов). Чтобы не возиться с выделением/высвобождением памяти, можно жёстко задать максимальный размер имени файла:
Соответственно, тогда простые сравнения уже не годятся:А нужно будет сравнение именно строк. В идеале, конечно, хотелось бы увидеть применение класса std::string. Далее. В add_node Вы в цикле поиска узла сравниваете так: а по окончании цикла уже так: Здесь проблема возникает, если t->name совпадает с parent->name, тогда Вы делаете присваивание не в ту ветку дерева (а она уже могла быть кем-то занята). Если же равенство имен файлов не допускается, то тогда Вам нужно мягко обойти эту ситуацию. Распишите себе, что Вы будете делать в таких ситуациях:
Лучше всего удаление одного узла оформить в виде отдельной функции, в которую кроме указателя на удаляемый узел передавать и предка этого узла (для root это будет 0, так как у него нет предка). А ещё можно поинтересоваться сбалансированными бинарными деревьями, например, Red-Black-Tree) -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
||||||
|
|||||||
Creder |
|
|||
Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 9.5.2015 Репутация: нет Всего: нет |
Я особо не силен в этом. Кое-что нашел в интернете. Подойдет ли это? И если да, то как модифицировать это под мое задание?
Здесь, вроде, соблюдаются все 3 условия удаления узла из дерева. Это сообщение отредактировал(а) Creder - 11.5.2015, 20:43 |
|||
|
||||
feodorv |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 12 Всего: 45 |
За основу - да. Но очень много ошибок в найденном коде...
-------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
|||
|
||||
Creder |
|
|||
Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 9.5.2015 Репутация: нет Всего: нет |
А если попробовать как-то так?
Это сообщение отредактировал(а) Creder - 15.5.2015, 15:58 |
|||
|
||||
Creder |
|
|||
Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 9.5.2015 Репутация: нет Всего: нет |
В общем, попытался сделать вот так, но компилятор выдает ошибки такого рода: |129|error: void value not ignored as it ought to be| |134|error: void value not ignored as it ought to be| |136|error: void value not ignored as it ought to be| |144|error: void value not ignored as it ought to be| Что не так? |
|||
|
||||
feodorv |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 12 Всего: 45 |
Функция removeNode не возвращает значения: поэтому присвоить чему-то возвращаемый результат работы функции (а его попросту нет) не удасться: -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
|||
|
||||
Creder |
|
|||
Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 9.5.2015 Репутация: нет Всего: нет |
Теперь при создании дерева программа стала вылетать. Где ошибка? |
|||
|
||||
feodorv |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 12 Всего: 45 |
Знакомое условие. В чем его смысл? Почему оно записано именно в таком дурацком виде? Девушка из соседней ветки, в которой решена задача, аналогичной Вашей, по этому поводу написала так:
Ну посмотрите на то, как Вы вставляете новый узел в дерево:
-------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
||||
|
|||||
Creder |
|
||||
Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 9.5.2015 Репутация: нет Всего: нет |
Хорошо. Переписал. Но все равно вылетает ошибка. Что опять не так?
Может, где-то напортачил в самой функции добавления узла?
Это сообщение отредактировал(а) Creder - 18.5.2015, 13:53 |
||||
|
|||||
feodorv |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 12 Всего: 45 |
Хорошо, что создание узла Вы внесли в цикл добавления. Теперь у Вас добавляются разве экземпляры узла. Но данные для этого узла, вводимые с клавиатуры, до узла не доходят. Узел добавляется в дерево в отрыве от этих данных. Более того, конструктор по умолчанию у Node отсутствует, поля у вновь создаваемого Node остаются неинициализированными. В C++ есть же прекрасная возможность создания экземпляра класса сразу с инициализирующими значениями - конструктор класса. Почему Вы ей не пользуетесь?
Да. Отбросив тот факт, что Вы сравниваете неинициализированные данные (то есть мусор), мы выясняем, что по окончании цикла curr есть 0. Если потом делать curr->name, curr->left, curr->right, то это значит сознательный крах программы. Это сообщение отредактировал(а) feodorv - 18.5.2015, 21:33 -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
|||
|
||||
Creder |
|
||||
Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 9.5.2015 Репутация: нет Всего: нет |
Т. е. сначала, мне надо это
сделать, э-э-э, так или как-то иначе?
Это сообщение отредактировал(а) Creder - 18.5.2015, 23:33 |
||||
|
|||||
feodorv |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 12 Всего: 45 |
Можно и так, но параметры-то конструктора должны же быть использованы для инициализации, да и left и right нужно занулить:
Если Вам не нравится такая форма конструктора, когда поля класса инициализируются до тела конструктора, а само тело конструктора пустое, используйте другой (пусть и худший) подход к конструктору:
Тогда все поля вновь создаваемого экземпляра класса будут правильно проинициализированы. PS Для имени файла при передаче конструктору используется ссылка и квалификатор const. PSS Имена аргументов конструктора изменены таким образом, чтобы они не совпадали с именами полей класса. -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
||||
|
|||||
Creder |
|
|||
Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 9.5.2015 Репутация: нет Всего: нет |
Что же, с добавлением узла я все таки разобрался, но я все так же не могу понять, как удалять узел. Тем более в моем случае. Как быть?
|
|||
|
||||
feodorv |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 12 Всего: 45 |
Гм. Простите мне мою лень, но второй раз описывать уже описанное не хочется. В соседней ветке всё есть, может не разжевано до конца, до очень много комментариев и пояснений, сделанных в том числе и для Вас. Вам только нужно изменить условие, при котором узел удаляется из дерева. ![]() -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
|||
|
||||
![]() ![]() ![]() |
Правила форума "C/C++: Для новичков" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |