elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Rompecabezas de Bitcoin, Medio millón USD en premios


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Interrupción en programa de C++ extraña - Arbol binario de busqueda.
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Interrupción en programa de C++ extraña - Arbol binario de busqueda.  (Leído 890 veces)
lb12

Desconectado Desconectado

Mensajes: 1


Ver Perfil
Interrupción en programa de C++ extraña - Arbol binario de busqueda.
« 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. =)


En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
MOVIDO: Arbol binario de busqueda
ASM
Eternal Idol 0 2,167 Último mensaje 15 Septiembre 2009, 19:18 pm
por Eternal Idol
Problemas con imprimir un arbol binario de busqueda junto a una lista simple!!
Programación C/C++
01munrra 1 4,345 Último mensaje 23 Junio 2011, 02:24 am
por BlackZeroX (Astaroth)
Arbol Binario de Busqueda
Programación C/C++
GoBrit 0 668 Último mensaje 12 Noviembre 2015, 21:29 pm
por GoBrit
Urgenteeeeee!!! Ayuda con arbol binario de busqueda
Programación C/C++
mathias_vg 2 1,179 Último mensaje 20 Noviembre 2015, 18:54 pm
por 0xFer
arbol binario de busqueda
Programación C/C++
danielSoccer 0 765 Último mensaje 11 Noviembre 2016, 02:08 am
por danielSoccer
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines