Определения структуры не могут быть изменены во время выполнения, как в вашем коде. Вы можете изменить их только во время компиляции, используя директиву препроцессора # if / # ifdef , но это слишком рано, поскольку в этот момент у вас еще нет ввода пользователя (если пользователь не может изменить исходный код и перекомпилируйте его).
Что вы можете сделать, это объединить эти структуры в одну, используя ключевое слово union :
struct rbtnode {
char *key;
colour_t colour;
rbt left;
rbt right;
};
struct bstnode {
char *key;
bst left;
bst right;
};
union bst_or_rbt_node {
struct bstnode bst_node;
struct rbtnode rbt_node;
};
Затем вы используете либо член rbt_node объединения, либо член bst_node в зависимости от ввода пользователя.
Убедитесь, что вы выделите достаточно места для bst_or_rbt_node (наиболее безопасным будет использование sizeof (bst_or_rbt_node)).
Кроме того, я надеюсь, что rbt и bst являются типами указателей.
Нет необходимости использовать союзы, но на вашем текущем уровне с ними может быть немного легче иметь дело, чем с указателями, например, на. пустота, указатель наведен.