Как исправить ошибку member reference base type 'AATree' (aka '_AATreeNode *') is not a structure or union

Вот исходники: AATree.h

#pragma once

typedef struct _AATreeNode
{
    int             key;
    int             level;
    _AATreeNode    *left;
    _AATreeNode    *right;
}AATreeNode, *AATree;

void aat_insertData  (AATree *, int);
void aat_deleteData  (AATree *, int);
AATree* aat_searchData  (AATree*,   int);
void aat_deleteTree  (AATree *);
void aat_printTree   (FILE   *, AATree, int);

сама функция:

AATree* aat_searchData(AATree* bst, int key)
{
    AATree*  i;
    i = bst;
    while (i != NULL)
    {
        if (key == i->key)
        {
            printf("нашел %d\n", i->key);
            return i;
        }
        if (key > i->key)
            i = i->right;
        else
            i = i->left;
    }
    return i;                                       // Not found.
}

Ответы (1 шт):

Автор решения: KoVadim

Если уже си, тогда структуру нужно объявлять по правилам си, где то так (обратите внимание на struct) :

typedef struct _AATreeNode
{
    int             key;
    int             level;
    struct  _AATreeNode    *left;
    struct  _AATreeNode    *right;
}AATreeNode, *AATree;

Теперь к собственно ошибке. Что такое i? - это указатель на AATree. А AATree - это в свою очередь указатель на структуру. Поэтому, когда Вы пишете i->key компилятор недоумевает, так как i - это struct _AATreeNode** (да, две звездочки) и так нельзя. Но можно вот так (*i)->key. С строкой вида i = i->right; чуть сложнее. Где то так i = &(*i)->right;

→ Ссылка