В моем коде есть структура двоичного дерева, определенная как:
typedef struct bintreestruct *bintree;
struct bintreestruct
{
double num;
char *s;
bintree l, r;
};
Я хотел вставить узел в это бинарное дерево поиска. Вот функция:
void insbintree(double i, char *s, bintree *t)
{
if (t == NULL)
{
bintree temp = (struct bintreestruct *)malloc(sizeof(struct bintreestruct));
temp->s = s;
temp->num = i;
temp->l = temp->r = NULL;
return temp;
}
if (strcmp(s, t->s) < 0)
t->l = insert(t->l, s);
else if (strcmp(s, t->s) >= 0)
t->r = insert(t->r, s);
return t;
}
Я получаю сообщение об ошибке error: ‘*t’ is a pointer; did you mean to use ‘->’? 62 | if (strcmp(s, t->s) < 0)
Либо я неправильно создаю новый узел, либо получаю доступ к элементам внутри в
неправильное использование указателей. Не знаю, как исправить эту ошибку
@chintu Как вы собираетесь вызывать функцию?
Кажется, вы пытаетесь написать рекурсивную функцию, потому что она вызывает сама себя.
Поскольку функция имеет операторы возврата с выражениями, ее тип возвращаемого значения не должен быть void
.
Также это объявление параметра bintree *t
эквивалентно struct bintreestruct **
из-за этого typedef
typedef struct bintreestruct *bintree;
Но внутри функции вы пытаетесь использовать его как имеющий тип struct bintreestruct *
.
И в этих вызовах самой функции
t->l = insert(t->l, s);
t->r = insert(t->r, s);
используются неполные и неправильно упорядоченные списки аргументов.
С учетом всего этого функцию можно объявить и определить как минимум следующим образом
bintree insbintree(double i, char *s, bintree t)
{
if (t == NULL)
{
t = malloc( sizeof( struct bintreestruct ) );
t->s = s;
t->num = i;
t->l = t->r = NULL;
}
else if ( strcmp(s, t->s) < 0 )
{
t->l = insert(i, s, t->l);
}
else
{
t->r = insert(i, s, t->r );
}
return t;
}
Обратите внимание, что использование объявления typedef для типа указателя — плохая идея. Это только сбивает с толку читателей кода.
bintree *t
-bintree
является псевдонимомstruct bintreestruct *
, поэтомуbintree *t
является указателем на указатель. И именно поэтому, дети, мы НЕ прячем типы указателей в псевдонимах typedef. Связанный:return t;
иreturn temp;
оба недействительны. Функция возвращаетvoid
.