Aprendiendo c. ABB

jose
25 de Enero del 2006
Hola,
quiero añadir palabras en un Arbol de Busqueda Binario. Tengo el codigo de
un ABB para añadir caracteres y supongo que debo hacerlo asi pero me es algo
complejo tratar con cadenas de caracteres:
(espero que podais ayudarme algo)

Para transformarlo supongo que debo hacer algo como esto:
/*********
int i;
char s2;

s2=actual->dato; //Quiero que haga esto
i = strcmp( dat, s2 ); //********Aunque Logicamente esta mal

while(!Vacio(actual) && i != 0) {
padre = actual;
if(i < 0) actual = actual->izquierdo;
else if(i > 0) actual = actual->derecho;
}
*********/

void Insertar(Arbol *a, char dat)
{
pNodo padre = NULL;
pNodo actual = *a;

while(!Vacio(actual) && dat != actual->dato) {
padre = actual;
if(dat < actual->dato) actual = actual->izquierdo;
else if(dat > actual->dato) actual = actual->derecho;
}

if(!Vacio(actual)) return;
if(Vacio(padre)) {
*a = (Arbol)malloc(sizeof(tipoNodo));
(*a)->dato = dat;
(*a)->izquierdo = (*a)->derecho = NULL;
}
else if(dat < padre->dato) {
actual = (Arbol)malloc(sizeof(tipoNodo));
padre->izquierdo = actual;
actual->dato = dat;
actual->izquierdo = actual->derecho = NULL;
}
else if(dat > padre->dato) {
actual = (Arbol)malloc(sizeof(tipoNodo));
padre->derecho = actual;
actual->dato = dat;
actual->izquierdo = actual->derecho = NULL;
}
}

// Lo llamo despues de recuperar la palabra de un fichero
while (!feof(s)) {
if (fscanf(s, "%s", &temp)==1){
Insertar(&Arbol, temp);
}
}

kike.ADO
25 de Enero del 2006
cuando quieres copiar una cadena, no puedes usar =
en su lugar usas la funcion
strcpy(cadDestino,cadOrigen)
tampoco te funcionaran expresiones como
if(cad == cad2)
en su lugar
if(!strcmp(cad,cad2))
El motivo del ! es que esta funcion devuelve 0 si son dos cadenas identicas
Un saludo

jose
25 de Enero del 2006
Bueno, encontre una solucion despues de varios intentos. Tengo k depurar algunos punteros pero ya funciona lo k queria.
Os adjunto la estructura tb para futuras consultas:

typedef struct _nodo {
char dato[10];
struct _nodo *derecho;
struct _nodo *izquierdo;
} tipoNodo;

typedef tipoNodo *pNodo;
typedef tipoNodo *Arbol;

int Insertar(Arbol *a, char *dat)
{
int i;
pNodo padre = NULL;
pNodo actual = *a;
char s2[10];

strcpy(s2,dat);

// no esta todo el codigo pero es una idea de como ir modificando el que puse arriba
while(!Vacio(actual)) { // por ejemplo
padre = actual;
i = strcmp( (*a)->dato, s2 ); // importante
if(i < 0) actual = actual->izquierdo; // :
else if(i > 0) actual = actual->derecho; //
}

Ah, y lo llamo asi. No es lo mas optimo. Tengo que cambiarlo:

char B[10], *p2;
p2=B;

ifstream filein;
filein.open(\\\"dates\\\", ios::in);
// se lee hasta el carácter ( )
filein.getline(text, 10, \\\\' \\\\'); //lee una palabra hasta un espacio en blanco
filein.close();

Insertar(&Arbol,p2); // Le paso arbol y puntero. Pero se puede simplificar.

Gracias por las ideas.