Página 1 de 2

tengo un problema con un arbol en C

Publicado: 15 May 2010, 18:00
por Xanatos
hola, pues tengo que hacer un programa e implementar unas funciones...

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

Re: tengo un problema con un arbol en C

Publicado: 15 May 2010, 18:20
por finfantasy
Prueba a poner free((void*)nodo);

Si la función está bien llamada, el único problema lo tienes que tener en el free, lo demás está bien.

Re: tengo un problema con un arbol en C

Publicado: 15 May 2010, 18:36
por Xanatos
mmmm
no tampoco!
:cry: gracias!

yo no le veo nada nada malo (como siempre que programo :roll: ) 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!

otro consejo??

-- Doble Post --

el me muestra un error asi:

DUMA Aborting: free(blabla): address not from DUMA or already freed.
ilegal instruction.


osea (creo yo), el libera un espacio de memoria y lo intenta liberar otra vez, y otra vez y otra vez, osea la funcion esta mal :ko: , la recursividad no funciona, pero como la cambio???

gracias!

Re: tengo un problema con un arbol en C

Publicado: 15 May 2010, 19:18
por m0skit0
Primero, no uses el valor 0 para un puntero. Usa NULL.

Yendo al tema, todo me parece bien. Te aconsejo que depures para ver dónde realmente falla destroy_nodes(). En mi opinión es posible que el problema radique en insert_help(). Mi consejo es que hagas que esa función imprima cada paso que hace, así salimos de dudas.

Re: tengo un problema con un arbol en C

Publicado: 15 May 2010, 19:21
por finfantasy
Puedes probar de poner al principio de la funcion que si el nodo es NULL, haga un return directamente.

Re: tengo un problema con un arbol en C

Publicado: 15 May 2010, 20:26
por Xanatos
finfantasy... tambien lo pense... pero no cambio nada... :( gracias

moskito: gracias por el consejo de lo de NULL, nunca habia tenido problemas, pero es verdad esas extracciones siempre son recomendables de hacer, no se mejoro pero bueno.

la funcion esa de insert_help mmm no se todo lo demas funciona voy a mirarla otra vez, es una muy parecida ah una que hicimos en clase, pero de pronto cometí algún error al modificarla.

si no ejecuto a free(node) no me produce error.... pero no es el objetivo! :laughing:

gracias!

pregunta: lo han compilado?? que error les presenta a ustedes??

Re: tengo un problema con un arbol en C

Publicado: 15 May 2010, 20:46
por finfantasy
No lo puedo probar, no tengo el portatil aqui. La verdad, que si el fallo está en la funcion de borrar, me he quedado sin ideas.

Re: tengo un problema con un arbol en C

Publicado: 16 May 2010, 02:23
por m0skit0
No, yo no le he compilado por falta de tiempo. A ver si mañana puedo hacerlo. Aunque la depuración deberías hacerla tú :roll:

Re: tengo un problema con un arbol en C

Publicado: 16 May 2010, 02:55
por Xanatos
si manana lo hago, ya me ocupe con otra cosa (malditasea siempre hay algo que hacer)!

porfa compila eso, un amigo dice que le funciona sin ningún problema y yo quede :?

pd: lo sabia moskito, no duermes nunca! eran las 2:20am cuando escribiste tu mensaje! :shock:

Re: tengo un problema con un arbol en C

Publicado: 16 May 2010, 02:59
por dark_sasuke
Xanatos escribió:pd: lo sabia moskito, no duermes nunca! eran las 2:20am cuando escribiste tu mensaje! :shock:


Es que los m0skit0s tienen una vida bastante corta, y tiene que aprovechar, no se yo como este no sa muerto XDDD