<div dir="ltr">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.<br>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.<br>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.<br>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.<br>Os dejo el código de mi funcion "venderLibro" (que funciona perfectamente) y el codigo que tengo de la otra funcion.<br><br>Código "venderLibro":<br><br><pre style="margin-top:0px;display:inline">Arbol* Arbol::descatalogar(Arbol *nodo, const char *titulo)<br>{<br> 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.<br> Arbol *aux;<br> if (nodo != NULL)<br> {//Si hay un nodo raiz en el arbol...<br> comp = strcmp(titulo, nodo->titulo);//Recogemos el resultado de la comparacion.<br> if (comp == 0)<br> {//Si la comparacion es 0 hemos encontrado el libro a descatalogar.<br> if (nodo->cantidad == 0)<br> {//Si la cantidad del libro encontrado es cero, podemos descatalogarlo.<br> cout << "La cantidad del libro a descatalogar es cero. Podemos continuar." << endl;<br> if (nodo->izq == NULL)<br> {//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.<br> aux = nodo->der;<br> }<br> else if (nodo->der == NULL)<br> {//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.<br> aux = nodo->izq;<br> }<br> else<br> {//En caso contrario, recolocamos el arbol para que no pierda su estructura.<br> for (aux = nodo->izq; aux->der != NULL; aux = aux->der);<br> aux->der = nodo->der;<br> aux = nodo->izq;<br> }<br> free(nodo->titulo);//Liberamos el nodo-arbol de memoria<br> delete(nodo);//Lo eliminamos<br> nodo = aux;//En su lugar ponemos el auxiliar para mantener la estructura del arbol.<br> cout << "El libro '" << titulo << "' ha sido correctamente descatalogado." << endl;//Mostramos mensaje de confirmacion.<br> }<br> else<br> {//En caso de que la cantidad no fuese 0, mostramos mensaje de error y no eliminamos nada.<br> cout << "No se ha podido descatalogar el libro debido a que su cantidad no era 0." << endl;<br> }<br> }<br> else if (comp < 0)<br> {//Si la comparacion titulo-nodo->titulo es menor que 0 buscamos por la izq<br> nodo->izq = descatalogar(nodo->izq, titulo);<br> }<br> else<br> {//En caso contrario, buscaremos por la derecha ya que quiere decir que es más grande (alfabeticamente hablando)<br> nodo->der = descatalogar(nodo->der, titulo);<br> }<br> }<br> return nodo;//Devolvemos el nodo.<br>}<br><br>Y aquí el código de la funcion "eliminarSinStock":<br><br></pre><div class=""></div><div class=""><pre style="margin-top:0px;display:inline">void Arbol::eliminarSinStock(Arbol *nodo)<br>{<br> if (nodo != NULL)//Si no esta vacio el arbol...<br> {<br> eliminarSinStock(nodo->izq);//Buscamos por la izq<br> if (nodo->cantidad == 0)<br> {//Si la cantidad del nodo actual es 0, mostramos por pantalla su informacion.<br> cout << "\nTitulo del libro: " << nodo->titulo << " - Cantidad: " << nodo->cantidad << endl;<br> descatalogar(nodo, nodo->titulo);<br> }<br> eliminarSinStock(nodo->der);//Buscamos por la derecha<br> }<br>}</pre></div><br>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... <br><br>A ver si me podeis echar un cable :S<br>Muchas gracias, un saludo. =)</div>