[C con Clase] Duda Arbol Binario de busqueda.

David Escribano david.escribanor en gmail.com
Vie Ene 9 17:51:42 CET 2015


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":

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":

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. =)
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.conclase.net/pipermail/cconclase_listas.conclase.net/attachments/20150109/85ad7a79/attachment.html>


Más información sobre la lista de distribución Cconclase