Hola! tengo una entrega en facultad y hay una función que me está matando...
me piden hacer una función que dado un arbol binario de busqueda y una lista, me devuelva el "camino" que hace esa lista si es que existe dentro del arbol... el encabezado es este:
camino_t buscar_camino(const lista l, const binario b);
y el tipo camino es asi:
struct camino_t {
bool existe ;
array_rama ramas ;
nat cantidad_ramas ;
};
PD: existe una función que creo que es util:
texto_t camino_a_texto(const camino_t c) {
texto_t res;
// espacio suficiente para "No existe" o para cada rama y la coma y la
// cantidad, el guión y los paréntesis.
char cadena[c.cantidad_ramas * 2 + 10];
if (!c.existe) {
strcpy(cadena, "No existe");
} else {
sprintf(cadena, "%d", c.cantidad_ramas);
strcat(cadena, "-(");
if (c.cantidad_ramas > 0) {
agregar_rama(cadena, c.ramas[0]);
for (nat i = 1; i < c.cantidad_ramas; i++) {
strcat(cadena, ",");
agregar_rama(cadena, c.ramas[i]);
}
}
strcat(cadena, ")");
}
res = cadena_a_texto(cadena);
return res;
}
al menos creo que de ahi se puede sacar algo...eso intenté pero no sale...se cuelga todo
AYUDAAAA
(http://imageshack.com/a/img922/685/L2w40e.jpg)
MOD EDIT: No hacer doble post.
¿Qué es...
texto_t
array_rama
nat
?
UY que mal, en 7 horas te respondo...
Cita de: MAFUS en 29 Abril 2016, 17:56 PM
¿Qué es...
texto_t
array_rama
nat
?
texto_t es un puntero a una estructura (registro) que tiene un campo que es otro puntero a un o varios carácter/es.
array_rama es un puntero a un enumerado que puede ser izq o der
typedef unsigned int nat;
me pregunto cómo se esto?... en fin.
Si lo que quieres es ver si una lista esta en un árbol binario de búsqueda.
#include <assert.h>
bool existe_camino(const lista l, const binario b) {
bool existe = true;
nodo* loc = inicio_lista(l); // loc es un puntero a un elemento de la lista
binario aux = b; // puntero auxiliar a arbol binario
assert(!es_vacia_lista(l) && !es_vacio_binario(b));
if (!es_igual_dato(loc, l, aux))
existe = false;
while (existe && loc != final_lista(l)) {
loc = siguiente(loc, l);
if (!es_vacio_binario(derecho(aux)) && es_igual_dato(loc, l, derecho(aux)))
aux = derecho(aux);
else if (!es_vacio_binario(izquierdo(aux)) && es_igual_dato(loc, l, izquierdo(aux)))
aux = izquierdo(aux);
else existe = false;
}
if (!es_vacio_binario(izquierdo(aux)) || !es_vacio_binario(derecho(aux)))
existe = false;
return existe;
}
luego tu ves como llenar la estructura camino_t.
solo para cerrar el tema...lo terminé resolviendo asi:
Citarcamino_t buscar_camino(const lista l, const binario b){
binario baux=b;
camino_t caux;
caux.existe=false;
caux.cantidad_ramas=0;
caux.ramas= new rama_t[largo_lista(l)];
bool bandera=true;
int i=0;
localizador loc=inicio_lista(l);
while (es_localizador_lista(loc) && bandera)
{ if (!es_vacio_binario(baux))
{bandera=comparar_texto(texto_info(raiz_binario(baux)),texto_info(info_lista(loc,l)))==igual; }
else {bandera=false;}
if (bandera)
{if (es_localizador_lista(siguiente(loc,l)))
{
texto_t texto_sig=texto_info(info_lista(siguiente(loc,l),l));
texto_t texto_actual=texto_info(info_lista(loc,l));
if (comparar_texto(texto_sig,texto_actual)==mayor)
{baux=baux->der; caux.ramas=der; i++;}
else
{baux=baux->izq; caux.ramas=izq; i++;}
}
}
loc=siguiente(loc,l);
}
if (!es_localizador_lista(loc) && altura_binario(baux)==1){caux.existe=bandera; caux.cantidad_ramas=i;}
else {delete[] caux.ramas;}
return caux;
}
(localizador es un puntero a un nodo de la lista)
De todas formas otras funciones tenian error y me quedé sin pasar todos los test que le hacen...mañana me dan el resultado pero creo que perdí el curso... :-\