Problema con arbol en ubuntu

Iniciado por Gallu, 27 Abril 2010, 01:22 AM

0 Miembros y 1 Visitante están viendo este tema.

Gallu

Buenas a todos , estoy intentando crear operaciones para un árbol binario y no se que sucede,  el compilador me da estos resultados

diego@diego-desktop:~/Documentos/fuente$ gcc arbol.c -o arbol
arbol.c: En la función 'main':
arbol.c:24: aviso: declaración implícita incompatible de la función interna 'malloc'
arbol.c: En la función 'insertar':
arbol.c:43: aviso: declaración implícita incompatible de la función interna 'malloc'
arbol.c: En la función 'arbol_to_array':
arbol.c:76: aviso: declaración implícita incompatible de la función interna 'realloc'
arbol.c:81: aviso: declaración implícita incompatible de la función interna 'realloc'
diego@diego-desktop:~/Documentos/fuente$

Pero cuando ejecuto me aparece los siguiente

*** glibc detected *** ./arbol: realloc(): invalid pointer: 0xbfe00bd8 ***
======= Backtrace: =========
/lib/tls/i686/cmov/libc.so.6[0xb7640604]
/lib/tls/i686/cmov/libc.so.6(realloc+0x242)[0xb7645022]
/lib/tls/i686/cmov/libc.so.6(realloc+0x42)[0xb7644e22]
./arbol[0x804872f]
./arbol[0x8048519]
/lib/tls/i686/cmov/libc.so.6(__libc_start_main+0xe5)[0xb75e7775]
./arbol[0x80483a1]
======= Memory map: ========
08048000-08049000 r-xp 00000000 08:05 10223911   /home/diego/Documentos/fuente/arbol
08049000-0804a000 r--p 00000000 08:05 10223911   /home/diego/Documentos/fuente/arbol
0804a000-0804b000 rw-p 00001000 08:05 10223911   /home/diego/Documentos/fuente/arbol
08ffa000-0901b000 rw-p 08ffa000 00:00 0          [heap]
b75d0000-b75d1000 rw-p b75d0000 00:00 0
b75d1000-b772d000 r-xp 00000000 08:05 376906     /lib/tls/i686/cmov/libc-2.9.so
b772d000-b772e000 ---p 0015c000 08:05 376906     /lib/tls/i686/cmov/libc-2.9.so
b772e000-b7730000 r--p 0015c000 08:05 376906     /lib/tls/i686/cmov/libc-2.9.so
b7730000-b7731000 rw-p 0015e000 08:05 376906     /lib/tls/i686/cmov/libc-2.9.so
b7731000-b7734000 rw-p b7731000 00:00 0
b7734000-b7741000 r-xp 00000000 08:05 327701     /lib/libgcc_s.so.1
b7741000-b7742000 r--p 0000c000 08:05 327701     /lib/libgcc_s.so.1
b7742000-b7743000 rw-p 0000d000 08:05 327701     /lib/libgcc_s.so.1
b7743000-b7746000 rw-p b7743000 00:00 0
b7746000-b7747000 r-xp b7746000 00:00 0          [vdso]
b7747000-b7763000 r-xp 00000000 08:05 328221     /lib/ld-2.9.so
b7763000-b7764000 r--p 0001b000 08:05 328221     /lib/ld-2.9.so
b7764000-b7765000 rw-p 0001c000 08:05 328221     /lib/ld-2.9.so
bfded000-bfe02000 rw-p bffeb000 00:00 0          [stack]
Cancelado

Agradeceria cualquier sugerencia , el código es el siguiente

#include <stdio.h>

typedef struct {
    int  info;
    void *izq , *der;
}Nodo;

//definimos el tipo puntero a nodo
typedef Nodo * PtrNodo;


void insertar(PtrNodo *ptrNodo, int info);
int esVacio(PtrNodo nodo);
int buscar(PtrNodo nodo, int elem);
int nodos(PtrNodo nodo);
int arbol_to_array(PtrNodo nodo, int **array, int numEle);

int main(){
    PtrNodo raiz = NULL;
    int array[] ={8,1,4,2,6,7};
    int info = 4;
    int  *elem;
    int i = 0;
    elem = (int*)malloc(sizeof(int));
    insertar(&raiz , array[0]);
    insertar(&raiz , array[1]);
    insertar(&raiz , array[2]);
    insertar(&raiz , array[3]);
    insertar(&raiz , array[4]);
    insertar(&raiz , array[5]);
    if(arbol_to_array(raiz, &elem , 0)){
        while(i < 5){
            printf("\nValor %d",elem[1]);
            i++;
        }
    }
    return 0;
}


void insertar(PtrNodo *ptrNodo, int info){
    if(esVacio(*ptrNodo)){
        *ptrNodo = (PtrNodo) malloc(sizeof(Nodo));
        (*ptrNodo)->info = info;
        (*ptrNodo)->izq = (*ptrNodo)->der = NULL;
    }
    else if ((*ptrNodo)->info < info) insertar((void*)(&(*ptrNodo)->der), info);
    else if ((*ptrNodo)->info > info) insertar((void*)(&(*ptrNodo)->izq), info);
}


int esVacio(PtrNodo nodo){
    if(nodo == NULL)return 1;
    return 0;
}

int buscar(PtrNodo nodo, int elem){   
  if (nodo == NULL) return 0;
  else if (nodo->info < elem) return buscar(nodo->der, elem);
  else if (nodo->info > elem) return buscar(nodo->izq, elem);
  else return 1;
}

int nodos(PtrNodo nodo){
    if(!nodo)return 0;
    else return(1 + nodos(nodo->izq) + nodos(nodo->der));
}
int arbol_to_array(PtrNodo nodo, int **array, int numElem){   
    if(!nodo){
        return 0;
    }else{       
        *array[numElem] = nodo->info;
        printf("\nPos:%d  ele:%d",numElem ,*array[numElem]);
        if(nodo->izq){
            numElem++;
            realloc(array , (numElem + 1) * sizeof(int));
            arbol_to_array(nodo->izq , array , numElem);
        }
        if(nodo->der){
            numElem++;
            realloc(array , (numElem + 1) * sizeof(int));
            arbol_to_array(nodo->der , array , numElem);
        }
        return 1;
    }
}


Nadie alcanza la meta con un solo intento, ni perfecciona la vida con una sola rectificación, ni alcanza altura con un solo vuelo.

SeC

Educad a los niños y no sera necesario castigar a los hombres - Pitagoras.

Gallu

Lo probaré en casa en ubuntu , pero aqui en el curro , con windows , se ejecuta una vez el print de arbol_to_array y peta
  printf("\nPos:%d  ele:%d",numElem ,*array[numElem]);
espero que se solucione solo con agregarle la libreria...
Nadie alcanza la meta con un solo intento, ni perfecciona la vida con una sola rectificación, ni alcanza altura con un solo vuelo.

Gallu

Nada de nada sec la salida de la ejecución del programa peta , alguien sabe que es lo que debo aprender para interpretar el resultado que me muestra la consola?

*** glibc detected *** ./arbol: realloc(): invalid pointer: 0xbf85d614 ***
======= Backtrace: =========
/lib/tls/i686/cmov/libc.so.6[0x699ff1]
/lib/tls/i686/cmov/libc.so.6(realloc+0x2b8)[0x69fa38]
/lib/tls/i686/cmov/libc.so.6(realloc+0x2d0)[0x69fa50]
./arbol[0x8048735]
./arbol[0x8048549]
/lib/tls/i686/cmov/libc.so.6(__libc_start_main+0xe6)[0x645b56]
./arbol[0x80483c1]
======= Memory map: ========
00492000-00493000 r-xp 00000000 00:00 0          [vdso]
0062f000-0076d000 r-xp 00000000 08:05 377255     /lib/tls/i686/cmov/libc-2.10.1.so
0076d000-0076e000 ---p 0013e000 08:05 377255     /lib/tls/i686/cmov/libc-2.10.1.so
0076e000-00770000 r--p 0013e000 08:05 377255     /lib/tls/i686/cmov/libc-2.10.1.so
00770000-00771000 rw-p 00140000 08:05 377255     /lib/tls/i686/cmov/libc-2.10.1.so
00771000-00774000 rw-p 00000000 00:00 0
00b25000-00b41000 r-xp 00000000 08:05 327685     /lib/libgcc_s.so.1
00b41000-00b42000 r--p 0001b000 08:05 327685     /lib/libgcc_s.so.1
00b42000-00b43000 rw-p 0001c000 08:05 327685     /lib/libgcc_s.so.1
00c72000-00c8d000 r-xp 00000000 08:05 327732     /lib/ld-2.10.1.so
00c8d000-00c8e000 r--p 0001a000 08:05 327732     /lib/ld-2.10.1.so
00c8e000-00c8f000 rw-p 0001b000 08:05 327732     /lib/ld-2.10.1.so
08048000-08049000 r-xp 00000000 08:05 10223911   /home/diego/Documentos/fuente/arbol
08049000-0804a000 r--p 00000000 08:05 10223911   /home/diego/Documentos/fuente/arbol
0804a000-0804b000 rw-p 00001000 08:05 10223911   /home/diego/Documentos/fuente/arbol
080ff000-08120000 rw-p 00000000 00:00 0          [heap]
b78db000-b78dc000 rw-p 00000000 00:00 0
b78ec000-b78ef000 rw-p 00000000 00:00 0
bf84a000-bf85f000 rw-p 00000000 00:00 0          [stack]
Pos:0  ele:8Cancelado

Nadie alcanza la meta con un solo intento, ni perfecciona la vida con una sola rectificación, ni alcanza altura con un solo vuelo.

Gallu

Estoy viendo que el problemas es el realloc  que no me reserva más memoria , el puntero *array en arbol_to_array  siempre mide 4 , alguien sabe por que sucede?
Nadie alcanza la meta con un solo intento, ni perfecciona la vida con una sola rectificación, ni alcanza altura con un solo vuelo.