Как и в другом ответе, вам нужно перечислить, чтобы определить тип каждого узла.
enum NodeType
{
NODE_LEAF, // A leaf node, no children
NODE_1, // One child
NODE_2, // Two children
NODE_3 // Three children
};
Затем определите структуры для каждого типа узла, которые имеют общий префикс:
struct NodeLeaf {
NodeType type;
...
};
struct Node1 {
NodeType type;
NodeType *child[1];
};
struct Node2 {
NodeType type;
NodeType *child[2];
};
struct Node3 {
NodeType type;
NodeType *child[3];
};
Дочерние указатели указывают на одну из структур, которые все начинаются с NodeType. Для удобства я уже дал им NodeType *
в качестве типа вместо void *
, чтобы было легче читать тип. Затем вы можете привести каждого дочернего элемента к правильной структуре в зависимости от того, что находится в * child [n]. И чтобы присвоить потомку приведение соответствующей структуры к NodeType*
или используйте foo.child[0] = &bar.type;
.