#c #pointers
#c #указатели
Вопрос:
У меня есть такая структура
struct binTree{
long long data;
struct binTree *left;
struct binTree *right;
}
И функция, подобная этой:
void height(struct binTree **r)
{
...
...
height(amp;(r->left));
height(amp;(r->right));
...
...
}
Компиляция вышеупомянутой функции выдает мне ошибку, подобную этой…
error: request for member ‘left’ in ‘* r’, which is of non-class type ‘binTree*’
error: request for member ‘right’ in ‘* r’, which is of non-class type ‘binTree*’
В чем проблема с кодом? Как передать указатели, которые у меня есть внутри структуры?
Комментарии:
1. Почему
height
функция должна приниматьbinTree **
вместо justbinTree *
? Вам нужно только двойное косвенное обращение, если вам нужно иметь возможность изменять входной указатель.2. Я предлагаю вам изучить некоторые книги по C , чтобы уйти от C (или пометить вопрос только как C)
Ответ №1:
Вы должны написать
height( amp;( ( *r )->left ) );
height( amp;( ( *r )->right ) );
Или более простой
height( amp;( *r )->left );
height( amp;( *r )->right );
Здесь операторы amp;
и *
являются унарными операторами, которые имеют меньший приоритет, чем постфиксные операторы, включая operator ->
PS Поскольку эта функция, как я думаю, не изменяет объект BinTree, вы могли бы упростить функцию и объявить параметр просто как
const struct binTree *r
или, если это программа на C , тогда
const binTree *r
В этом случае синтаксические конструкции, используемые в функции, были бы проще.
Только я не понимаю, почему он имеет возвращаемый тип void.:) Разве функция не должна возвращать высоту двоичного дерева или высота выводится внутри тела функции? было бы лучше, если бы функция возвращала высоту. В этом случае вы могли бы, например, сравнить высоты двух двоичных деревьев.
Ответ №2:
Это более понятный синтаксис:
void height(struct binTree **r)
{
struct binTree* pr = *r;
height( amp;pr->right );
height( amp;pr->left );
}