Ver Mensaje Individual
  #2 (permalink)  
Antiguo 22/11/2012, 04:58
vosk
 
Fecha de Ingreso: agosto-2012
Mensajes: 601
Antigüedad: 12 años, 4 meses
Puntos: 83
Respuesta: implementación árboles binarios y colas

El problema lo tienes en que no inicializas los datos de la estructura COLA: cuando declaras una variable y no inicializas, cualquier operacion que no sea de asignacion se hace contra datos basura del bloque de memoria al que está apuntando la variable; te pongo un ejemplo de lo que sucede:

Código:
COLA actual;
actual.fin += 1;
printf("%d", actual.fin);
Que crees que se mostrará por pantalla? 1?? Se puede dar la remota casualidad que el dato basura guardado en actual.fin equivalga al entero 0 y el resultado de la suma sea 1, pero es posible que aun provando infinitas veces no se cumpliera.

En la funcion 'recorrer()' declaras 'COLA actual' y seguidamente la envias sin inicializar a la funcion 'insertarcola()' donde lo primero que hace es comprobar si la cola está llena, te dejo una ayuda para ver como funciona por dentro esta primera llamada, que provoca un error que se arrastra por las demas funciones (será tu tarea ver el flujo de datos por dentro de las demas funciones, y tambien sobre cualquier funcion que hagas a partir de ahora ya sea sobre este programa o sobre cualquier otro):

Código:
bool colallena (struct COLA *cola) {
        bool valor;
        int pos;
        
        if (cola->fin==maxcola) {
            pos = 0;
        }
        else {
            pos = cola->fin;
        }
        
        if((cola->fr==pos)&& (cola->fin!=0)) {
            valor=true;
        }
        else {
            valor = false;
        }
        
        return valor;
    }
El primer condicional raramente se cumplirá porque 'cola->fin' llegó sin inicializar y aun contiene datos basura, luego por defecto siempre se cumple el 'else', con lo que asignas a 'pos' el dato basura de 'cola->fin'. Vas al siguiente condicional y comparas otra variable no inicializada que contiene datos basura con la variable 'pos' que segun el condicional anterior le has asignado otro dato basura, el resultado es que nunca (sería mucha casualidad) se cumplirá el segundo condicional, con lo que resuelve diciendo siempre que COLA está vacía, ok?

Solucion: inicializar todas las variables antes de hacer operaciones sobre ellas. Por suerte para ti la implementacion es muy simple, antes de usar COLA actual tienes que asignar un dato base a las variables

Código:
COLA actual;

actual.fin = 0;
actual.fr = 0;
Ya tienes tu programa funcionando.

Ahora echa un vistazo a tu funcion 'nodo *crear_nodo(int dato)', que pasa con las variables 'llink' y 'rlink'? Que sucedería si no las inicializas con NULL y las dejas apuntando al bloque de memoria que se le asigna el procesador?

Mas cosas, cuando bloqueas memoria dinamica debes hacer la comprovacion de error para el caso de que no haya disponible:

Código:
nodo *aux = (nodo *)malloc(sizeof(nodo));
if(!aux) {/*error*/}
Pero esto se hace en C, en c++ se recomienda no usar malloc para bloquear memoria dinamica, con 'new' puedes hacer lo mismo (y obviamente hacer las comprovaciones de error que con 'new' tienes que hacer con exceptions). Ademas en c++ usa los 'static_cast<tipo>' en vez de los typecast de C. En tu caso creo que no hay problema con eso, de todas formas te lo comento:

Código:
aux = new (nothrow) nodo;
if(!aux) {/*error*/}
Y cuando usas memoria dinamica tienes que liberarla cuando ya no la necesites; todos los bloques de memoria reservados con 'malloc' (en c++ con 'new') tienes que liberarlos con 'free' (en c++ con 'delete') (en c++ con new y delete hay varias cosas a tener en cuenta, mejor echa un vistazo a algun manual).

Saludos
vosk