Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: lb12 en 7 Enero 2015, 22:13 pm



Título: Interrupción en programa de C++ extraña - Arbol binario de busqueda.
Publicado por: lb12 en 7 Enero 2015, 22:13 pm
Hola, estoy con una práctica de la universidad y me piden tener controlado el stock de los libros de una libreria mediante utilizando árboles binarios de busqueda. Tenemos que utilizar C++. Tenemos que usar las funciones "ingresarLibro", venderLibro, etc.
El problema surge cuando me piden que implemente una funcion que elimine de mi arbol de busqueda los libros (nodos) que tengan un stock(cantidad) igual a 0.
Implemento practicamente el mismo codigo que en la funcion "venderLibro" ya que a esa funcion le tengo que pasar el titulo del libro a vender y se encarga de buscar en el árbol comparando entre nodos, si encuentra el libro, en caso afirmativo lo elimina sin problemas, en caso contrario, recursivamente sigue buscando.
El caso es que la funcion "venderLibro" funciona a la perfección y los punteros igualmente. Sin embargo, a la hora de implementar la funcion que me elimine todos los libros que encuentre con stock = 0, da interrupcion porque borra el nodo pero parece que en vez de dejarlo a NULL como hace la funcion "venderLibro", no lo hace.
Os dejo el código de mi funcion "venderLibro" (que funciona perfectamente) y el codigo que tengo de la otra funcion.

Código "venderLibro":

Código:
Arbol* Arbol::descatalogar(Arbol *nodo, const char *titulo)
{
int comp;//Declaro variable con el resultado de la comparacion entre el titulo pasado por parametro y el del nodo-arbol en el que estamos.
Arbol *aux;
if (nodo != NULL)
{//Si hay un nodo raiz en el arbol...
comp = strcmp(titulo, nodo->titulo);//Recogemos el resultado de la comparacion.
if (comp == 0)
{//Si la comparacion es 0 hemos encontrado el libro a descatalogar.
if (nodo->cantidad == 0)
{//Si la cantidad del libro encontrado es cero, podemos descatalogarlo.
cout << "La cantidad del libro a descatalogar es cero. Podemos continuar." << endl;
if (nodo->izq == NULL)
{//Si el nodo izquiero del libro a descatalogar apunta a NULL, nos apoyamos en un arbol aux para guardar el valor del nodo-arbol derecho.
aux = nodo->der;
}
else if (nodo->der == NULL)
{//Si el nodo derecho del libro a descatalogar apunta a NULL, nos apoyamos en un arbol aux para guardar el valor del nodo-arbol izquierdo.
aux = nodo->izq;
}
else
{//En caso contrario, recolocamos el arbol para que no pierda su estructura.
for (aux = nodo->izq; aux->der != NULL; aux = aux->der);
aux->der = nodo->der;
aux = nodo->izq;
}
free(nodo->titulo);//Liberamos el nodo-arbol de memoria
delete(nodo);//Lo eliminamos
nodo = aux;//En su lugar ponemos el auxiliar para mantener la estructura del arbol.
cout << "El libro '" << titulo << "' ha sido correctamente descatalogado." << endl;//Mostramos mensaje de confirmacion.
}
else
{//En caso de que la cantidad no fuese 0, mostramos mensaje de error y no eliminamos nada.
cout << "No se ha podido descatalogar el libro debido a que su cantidad no era 0." << endl;
}
}
else if (comp < 0)
{//Si la comparacion titulo-nodo->titulo es menor que 0 buscamos por la izq
nodo->izq = descatalogar(nodo->izq, titulo);
}
else
{//En caso contrario, buscaremos por la derecha ya que quiere decir que es más grande (alfabeticamente hablando)
nodo->der = descatalogar(nodo->der, titulo);
}
}
return nodo;//Devolvemos el nodo.
}

Y aquí el código de la funcion "eliminarSinStock":

Código:
void Arbol::eliminarSinStock(Arbol *nodo)
{
if (nodo != NULL)//Si no esta vacio el arbol...
{
eliminarSinStock(nodo->izq);//Buscamos por la izq
if (nodo->cantidad == 0)
{//Si la cantidad del nodo actual es 0, mostramos por pantalla su informacion.
cout << "\nTitulo del libro: " << nodo->titulo << " - Cantidad: " << nodo->cantidad << endl;
descatalogar(nodo, nodo->titulo);
}
eliminarSinStock(nodo->der);//Buscamos por la derecha
}
}

Cuando selecciono la opcion de "eliminarSinStock", la ejecuta pero la vuelve a hacer e ignora como que "nodo" está a NULL y claro, da error porque no encuentra nodo->izq...

A ver si me podeis echar un cable :S
Muchas gracias, un saludo. =)