All your code refers to a variable type nd defined as:
typedef struct node *nd;
In this case nd defines a pointer to an 'incomplete' node structure.
The structure 'node' is defined nowhere, so when you want access fields of the structure the compiler doesn't know how to get them (the structure is incomplete no fields are defined anywhere :)).
Perhaps you would refer to a 'NODE' structure defined as:
typedef struct NODE *nd;
In this case you made a typo error ;)
To avoid the problem it's better to always define structures and all their reference types on the same line:
typedef struct
{
BOOK rec;
nd right;
nd left;
}NODE, *nd;
This will at least avoid typo errors because you don't have to rewrite references.
P.S. I assumed that you are aware that C is case sensitive language, meaning that 'node' and 'NODE' are
not the same.