Hola. Te recomendaría que para hacer un árbol n-ario no usaras una lista, ya que es tremendamente ineficiente (excepto en búsquedas en anchura) y se desperdicia mucha memoria a no ser que el árbol esté muy bien equilibrado.
Mi consejo es que uses una estructura de nodos asociados en forma de árbol, donde en cada nodo se guarden los hijos. Una posible representación sería:
typedef struct st_nodo_t
{
void *datos;
struct st_nodo_t **hijos;
} nodo_t;
Así, datos sería la información que se almacena en cada nodo e hijos sería un array de punteros a los hijos. Si quieres crear un árbol 32-ario (por ejemplo) el campo hijos se inicializaría así:
nodo.hijos = (nodo_t**) malloc(sizeof(nodo_t**) * 32);
Suponiendo nodo una variable de tipo nodo_t.
Ahora sólo quedaría crear cada hijo, haciendo una reserva de memoria para cada nodo en cada una de las posiciones del array hijos. Si un nodo no tiene los 32 hijos, puedes dejar sus punteros a NULL para representarlo.
De esta forma puedes recorrer fácilmente el árbol en profundidad (en anchura, para hacerlo eficiente, hay que complicar un poco los nodos, con punteros a los hermanos). También es sencillo realizar inserciones, búsquedas, etc, todo con coste log n (si el árbol está ordenado), usando funciones recursivas.
Espero haberte servido de ayuda.
Un saludo.