![]() |
|
Модераторы: bsa |
![]()
|
|
| yngwie19 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 829 Регистрация: 15.6.2008 Где: Новгород Репутация: нет Всего: нет |
Здравствуйте всем. Вот пример бинарного дерева, пока что с одной возможностью - добавления новых элементов:
Вопрос в следующем, для добавления нового элемента здесь используется функция insertNode(), которая в свою очередь вызывает функцию-утилиту insertHelper(). Этой функции в качестве первого параметра передается указатель на указатель узла дерева (в первом это корень дерева). А можно ли обойтись без функции insertHelper() для рекурсивного добавления нового элемента? Я так понимаю она используется для сохранения указателя на корень дерева? я прав? |
|||
|
||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 35 Всего: 223 |
Обойтись можно, но нужно ли? Процедура вставки узла в дерево рекурсивная, а любая рекурсия должна с чего то начинаться. Для того и сделана функция insertNode - для старта рекурсивного процесса с явно заданного узла (корня)
Можно сделать так:
|
|||
|
||||
| baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 15 Всего: 101 |
insertNode отвечает за вставку узла в дерево (в определенное дерево *this) insertHelper отвечает за вставку узла в произвольное поддерево. две задачи - две функции.
пожалуй insertHelper лучше сделать private, он кажется лишним в (открытом) интерфейсе класса. его вообще можно сделать статическим или другом класса, т.к. он не работает с this. |
|||
|
||||
| arinamalina |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 3 Регистрация: 25.3.2010 Репутация: нет Всего: нет |
а можно полный рабочий код посмотреть?
у меня просто лаба похожая |
|||
|
||||
| yngwie19 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 829 Регистрация: 15.6.2008 Где: Новгород Репутация: нет Всего: нет |
Все-таки скажите пожалуйста зачем здесь использовать **ptr, почему нельзя использовать *ptr.
P.S: когда работал с простыми указателями на переменные и структуры то думал что все понимал, а тут с этими указателями на указатель совсем мозг сломал. |
|||
|
||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 35 Всего: 223 |
||||
|
||||
| yngwie19 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 829 Регистрация: 15.6.2008 Где: Новгород Репутация: нет Всего: нет |
xvr, а мы не потеряем таким образом значение rootPtr ?
|
|||
|
||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 35 Всего: 223 |
Не потеряем, а наоборот - найдем |
|||
|
||||
| yngwie19 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 829 Регистрация: 15.6.2008 Где: Новгород Репутация: нет Всего: нет |
xvr, т.е это связано с тем, что когда мы вызываем insertNpdeHelper(rootPtr,data) так, то в эту функцию передается копия адреса, т.е после изменения его в insertNodeHelper() rootPtr также указывать на старое значение (в первом вызове на мусор) ?
|
|||
|
||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 35 Всего: 223 |
Это связанно с тем, что при вставлении узла в пустое дерево вызов insertNpdeHelper(rootPtr,data) должен поменять rootPtr c NULL на data (точнее на TreeNode<NODETYPE>* от data). Если insertNpdeHelper описан как insertNpdeHelper(TreeNode<NODETYPE>* root, ...), то он не сможет поменять свой параметр. Т.е. все присваивания в root так и останутся внутри insertNpdeHelper, а фактический параметр из места вызова (rootPtr) так и останется NULL
|
|||
|
||||
| yngwie19 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 829 Регистрация: 15.6.2008 Где: Новгород Репутация: нет Всего: нет |
||||
|
||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 35 Всего: 223 |
Потому что в С++ параметры передаются by-value (за исключением параметров типа <type>& - они by-ref). Т.е. при вызове процедуры параметр является локальной переменной процедуры, которую инициализируют значением фактического параметра. Никакие присваивания внутри процедуры этой локальной переменной (формальному параметру процедуры) не влияют на фактический параметр
Это сообщение отредактировал(а) xvr - 22.10.2010, 10:42 |
|||
|
||||
| baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 15 Всего: 101 |
все параметры by value. передается копия ссылки. прост все ссылки на одно и то же суть синонимы. yngwie19, не читай мой пост Добавлено @ 13:39 для yngwie19: в функции С++ параметры передаются по значению (можно интерпретировать как передачу копии), поэтому изменить объект, переданный в качестве параметра, невозможно. но если передавать ссылочные типы - указатели или ссылки - то можно изменить объект, на который они указывают/ссылаются. поэтому традиционно в С использовалась передача указателя, если нужно было изменить значение. классический пример - scanf() в С++ появились ссылки, которые синтаксически неотличимы от обычных переменных, но реализованы через указатели, поэтому (как бы) появилась возможность передавать аргументы по ссылке. ну а если нужно изменить значение указателя, надо передать его адрес, т.е. указатель на указатель:
Это сообщение отредактировал(а) baldina - 22.10.2010, 13:42 |
|||
|
||||
| yngwie19 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 829 Регистрация: 15.6.2008 Где: Новгород Репутация: нет Всего: нет |
||||
|
||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 35 Всего: 223 |
Об утечке памяти можно говорить в программе, которая работает. 'если использовать *ptr' то программа работать не будет, поэтому вопрос об утечках памяти в ней аналогичен вопросу о тяжести заболевания ангиной у трупа |
|||
|
||||
![]()
|
| Правила форума "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. |