y bueno todo funciona, pero cuando tengo que borrar todo el arbol, no se que pasa, explota como si no viera un limite
por favor una ayudita
Código: Seleccionar todo
#include <duma.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct node_s
{
    char songtitle[256],interpreter[256];
    struct node_s *parent,*left,*right;
} node_t;
node_t *create_node(char songtitle[],char interpreter[]);
node_t *insert_node(node_t *rootnode, char songtitle[], char interpreter[]);
void insert_help(node_t *parent, node_t **node_ptr, node_t *new_node);
void tree_print(node_t *node, long level);
void destroy_nodes(node_t *node);
node_t *search_node(node_t *node, char songtitle[]);
long count_nodes(node_t *rootnode);
long count_nodes_with_interpreter(node_t *rootnode, char interpreter[]);
int main()
{
    node_t *playlist;
    node_t *isthier=0;
//Datos para alimentar el programa
    playlist=insert_node(playlist,"m","1");
    playlist=insert_node(playlist,"b","2");
    playlist=insert_node(playlist,"a","3");
    playlist=insert_node(playlist,"d","4");
    playlist=insert_node(playlist,"p","1");
    playlist=insert_node(playlist,"o","3");
    playlist=insert_node(playlist,"s","4");
// el imprime los datos asi volteando la pantalla de izquierda a derecha
    tree_print(playlist,0);
// la variable isthier es solo para ver si encontro o no lo que buscaba
    isthier = search_node(playlist,"b");
     if(isthier) printf("Voila");
     else printf("NO NO");
    printf("\nNodes im Tree: %ld\n", count_nodes(playlist));
    printf("\nHit im Tree: %ld\n", count_nodes_with_interpreter(playlist,"4"));
    getchar();
    // hasta aca funciona bien tooooodo funciona da numero de nodos y la cantidad de canciones por artista
    // al llamar la siguiente funcion EXPLOTA AAAAAAAAAAAAAAAA.
    destroy_nodes(playlist);
    printf("Hello world!\n");
    return 0;
}
node_t *create_node(char songtitle[],char interpreter[])
{
    node_t *new_node=0;
    if((new_node=malloc(sizeof(node_t))))
    {
        strcpy(new_node->songtitle,songtitle);
        strcpy(new_node->interpreter,interpreter);
        new_node->parent=0;
        new_node->left=0;
        new_node->right=0;
        return new_node;
    }
    else
    {
        printf("no memory");
        return 0;
    }
}
node_t *insert_node(node_t *rootnode, char songtitle[], char interpreter[])
{
    node_t *new_node=0;
    if(new_node=create_node(songtitle,interpreter))
    {
        insert_help(0,&rootnode,new_node);
        return rootnode;
    }
    else
    {
        printf("No memory!");
        return 0;
    }
}
void insert_help(node_t *parent, node_t **node_ptr, node_t *new_node)
{
    node_t *node = *node_ptr;
    if (node == 0)
    {
        new_node->parent = parent;
        *node_ptr = new_node;
    }
    else
    {
        if(strncmp(new_node->songtitle,node->songtitle,255)<=0)
            insert_help(node, &node->left, new_node);
        else
            insert_help(node, &node->right, new_node);
    }
}
void tree_print(node_t *node, long level)
{
    long i;
    if (node->left) tree_print(node->left, level + 5);
    for (i = 0; i < level; ++i) printf("  ");
    printf("%s\n",node->songtitle);
    if (node->right) tree_print(node->right, level + 5);
}
/////////////////////PROBLEMA/////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////
void destroy_nodes(node_t *node)
{
    if(node->left)
        destroy_nodes(node->left);
    if(node->right)
        destroy_nodes(node->right);
    free(node);
}
node_t *search_node ( node_t *rootnode , char songtitle[]){
    if(rootnode==0)
        return 0;
    node_t *tmp=0;
    static node_t *blatt=0;
    if(rootnode->left){
        tmp=search_node(rootnode->left, songtitle);
    }
    if(rootnode->right){
        tmp=search_node(rootnode->right, songtitle);
    }
    if(strcasecmp(rootnode->songtitle, songtitle)==0)
        blatt=rootnode;
    return blatt;
}
long count_nodes(node_t *rootnode)
{
    long counter=0;
    if(rootnode->left)
        counter+=count_nodes(rootnode->left);
    if(rootnode->right)
        counter+=count_nodes(rootnode->right);
    counter++;
    return counter;
}
long count_nodes_with_interpreter(node_t *rootnode, char interpreter[])
{
    long counter=0;
    if(rootnode->left)
        counter+=count_nodes_with_interpreter(rootnode->left,interpreter);
    if(rootnode->right)
        counter+=count_nodes_with_interpreter(rootnode->right,interpreter);
    if(strcmp(rootnode->interpreter,interpreter)==0)
        counter++;
    return counter;
}
la función problema tiene el nombre
/////////////////////PROBLEMA/////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////
void destroy_nodes(node_t *node)
....
gracias


 gracias!
  gracias! ) pero es algo tan tan sencillo que no se por que no funciona, la funcion como que no se mantiene en limites con la recursion!
 ) pero es algo tan tan sencillo que no se por que no funciona, la funcion como que no se mantiene en limites con la recursion! , la recursividad no funciona, pero como la cambio???
 , la recursividad no funciona, pero como la cambio???


 gracias
  gracias 
  
 


