Question:
I have this structure:
typedef struct Nodo
{
int valor;
int numSubNodos;
struct Nodo *padre;
struct Nodo **hijo;
} Nodo;
To fill it as an unbalanced non-binary tree, or better said, that a node can have several children and not all nodes have the same number of children.
The function I use every time I go to create a node is this:
Nodo *crearNodo (Nodo *padre, int numSubNodos, int valor)
{
Nodo *node;
node = (Nodo *)malloc(sizeof(Nodo));
//printf( "Nodo creado: %d\n", node);
node->valor = valor;
node->padre = padre;
if (numSubNodos > 0)
node->hijo = malloc( numSubNodos * sizeof(Nodo*) );
else
node->hijo = NULL;
return node;
}
And to free the memory I use this other function:
int freeNodos (Nodo *node)
{
if (node == NULL)
return 0;
for (int i = 0; i < nodo->numSubNodos; i++)
freeNodos(nodo->hijo[i]);
free (node);
}
The program stores the values and prints them, however at the moment of freeing the memory the program stops and says that it must close.
So I ask myself: Am I declaring the children array correctly? and How can I free the memory?. Thanks a lot.
Answer:
Everything indicates that you are missing the line that I marked with the comment.
Nodo *crearNodo (Nodo *padre, int numSubNodos, int valor)
{
Nodo *node;
node = (Nodo *)malloc(sizeof(Nodo));
//printf( "Nodo creado: %d\n", node);
node->valor = valor;
node->padre = padre;
node->numSubNodos = numSubNodos; // <<--- AQUI
if (numSubNodos > 0)
node->hijo = malloc( numSubNodos * sizeof(Nodo*) );
else
node->hijo = NULL;
return node;
}
And well, to finish off the play… you need a free
:
int freeNodos (Nodo *node)
{
if (node == NULL)
return 0;
for (int i = 0; i < nodo->numSubNodos; i++)
freeNodos(nodo->hijo[i]);
free(node->hijo); // <<--- AQUI
free(node);
}
Keep in mind that if you make two memory reservations to create a node, you necessarily need two releases to avoid memory leaks.
By the way, note that freeNodos
should return an integer and returns nothing.