| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > рекурсия для обхода н-арного дерева |
| Автор: tonchitos 13.3.2008, 20:37 | ||||||
| В общем господа, мне надо добраться до каждого узла и вызвать для каждого узла ф-ию его печати. Причем не просто обойти, ав определенном порядке, тк текст надо вывести структурированно примерно так:
В опщем есть тут любители алгоритмов?
мой класс дерево:
|
| Автор: bsa 13.3.2008, 22:19 | ||
Проблема возникла из-за того, что метод printFile делает не совсем то, что надо. я бы его реализовал так:
|
| Автор: tonchitos 14.3.2008, 00:29 |
| так она пробегает одну ветку, чет не то...или я недопоняла? |
| Автор: bsa 14.3.2008, 00:42 | ||
| Если ты вызовешь метод printFile() у корневого нода, то будут распечатаны все ноды рекурсивно и с отступами (по идее, на самом деле читай в конце). А тебе точно нужно выводить в FILE, а не в std::ostream? А то для С++ это не очень естественно. Например:
|
| Автор: tonchitos 14.3.2008, 00:58 | ||
| bsa, разьясните пожалуйста поподробнее. ведь если функция проходит ветку:
Трудность в том как остальные ветки пробежать. Ведь бежать он должен так, иначе не запишет как надо ![]() |
| Автор: bsa 14.3.2008, 01:19 |
| tonchitos, рекомендую откомпилировать и пройтись отладчиком. На самом деле схема немного иная (т.е. стрелки немного иначе рисовать надо), но порядок тот же. Это рекурсия. Смысл ее такой, нод выводит свои данные, затем последовательно говорит своим потомкам (тоже нодам!) вывести свои. Они выводят в том же порядке (т.е. свои и своих потомков). И все повторяется... |
| Автор: tonchitos 14.3.2008, 15:57 |
| Автор: tonchitos 14.3.2008, 17:34 | ||
| народ, если я верно поняла то ф-ия чтения из файл классу принадлежать не могет. Кароч. Хотя в принципе могет. в общем примерно че я насоображала на скорую руку (не ругайте, сама знаю что фигово)
предложите плиз более изящный вариант |
| Автор: bsa 14.3.2008, 19:33 |
| Вопрос, а для чего это нужно? Если это курсовая/домашнее задание, то можно это сделать записывая количество потомков у каждого чилда (быстрое и простое решение)... А вот если это работа и речь идет о каком-то проекте, то надо поступать более универсально (с использованием сторонних библиотек). И в этом случае, дерево (т.е. нод) надо тоже переписывать. Имхо. |
| Автор: tonchitos 17.3.2008, 01:20 |
| Дело в том что это на работе, но не для проекта. Тк я только устроилась они мне для разминки задание дали. |
| Автор: bsa 17.3.2008, 01:35 | ||
| Если тебе можно пользоваться сторонними библиотеками, то рекомендую в данном случае использовать TinyXML. Очень легко все записывается и считывается из файла. Да и файл хорошо отформатирован по умолчанию. Если нельзя, то делай так:
|
| Автор: tonchitos 17.3.2008, 18:29 | ||
вот ф-ия для чтения в файл. Меня в ней выкидывает почему то
|
| Автор: bsa 17.3.2008, 18:49 | ||
| вообще-то есть стандартный манипулятор для пропуска пробельных символов - http://www.cplusplus.com/reference/iostream/manipulators/ws.html. Зачем было изобретать велосипед? Что произойдет, если я руками воткну пробел в файл? Очень плохо затачиваться на определенное количество пробелов. Поэтому, забудь про ignore(). Если тебе очень нужно красиво оформить файл (отступы сделать), то сделай так, чтобы начало данных на строке характеризовал какой-то определенный символ:
|
| Автор: tonchitos 17.3.2008, 19:38 |
| без игнора накак, надо же символы пропускать перед и после интов |
| Автор: tonchitos 17.3.2008, 19:54 |
| а за std::ws спасибо большое. |
| Автор: bsa 17.3.2008, 20:48 |
| надеюсь теперь, ты знаешь, как пропускать символы без игнора. Кстати, на том сайте еще много чего описано. |