/* Arbol.c */
#include <stdio.h> // esta biblioteca sirve para gestionar memoria
#include <malloc.h> // esta biblioteca sirve para gestionar memoria
#ifndef Elem
#define Elem int
#endif
#include "errores.c"
/* Definicion de los tipos -las estructuras- de la ArbolBin */
//typedef Elem int;
typedef struct nodo * ArbolBin;
struct nodo {
Elem dato;
ArbolBin izq;
ArbolBin der;
};
/* Definicion de las funciones de la ArbolBin */
ArbolBin nuevoAB();
ArbolBin insertaAB(int,Elem,ArbolBin);
ArbolBin insertaABx(int,Elem,ArbolBin);
ArbolBin insertaABr(Elem,ArbolBin);
ArbolBin buscaAB(Elem,ArbolBin);
int esVacioAB(ArbolBin);
ArbolBin recorreABp(ArbolBin);
void imprimeABp(ArbolBin);
/* CUERPOS DE LAS FUNCIONES */
ArbolBin nuevoAB(){
return(NULL);
}
ArbolBin insertaAB(int n,Elem elem,ArbolBin arbol){
if(arbol == NULL)
return(insertaABr(elem,arbol));
else
return(insertaABx(n,elem,arbol));
}
ArbolBin insertaABx(int n, Elem elem,ArbolBin arbol){
ArbolBin tempo,x;
/*Verifica que la aizqnacion de nueva memoria a tempo sea exitosa
* (ArbolBin) es una promocion de tipos de lo que regresa malloc
* malloc gestiona memoria suficiente para un dato de tipo struct nodo */
if(arbol == NULL)
error(1);
else
if(tempo = (ArbolBin)malloc(sizeof(struct nodo))){
tempo->dato=elem;
if(n == 0){
printf("\t\tinsertando en lado izquierdo...\n");
tempo->izq=arbol->izq; // Se conecta con el subarbol izquierdo
tempo->der=nuevoAB(); // Se conecta con el subarbol derecho
arbol->izq=tempo;
}
else{
printf("\t\tinsertando en lado derecho...\n");
tempo->der=arbol->der; // Se conecta con el subarbol izquierdo
tempo->izq=nuevoAB();
arbol->der=tempo;
}
}
return arbol;
}
ArbolBin insertaABr(Elem elem,ArbolBin arbol){
ArbolBin tempo,i,d;
/*Verifica que la aizqnacion de nueva memoria a tempo sea exitosa
* (ArbolBin) es una promocion de tipos de lo que regresa malloc
* malloc gestiona memoria suficiente para un dato de tipo struct nodo */
if(tempo = (ArbolBin)malloc(sizeof(struct nodo))){
if(arbol == NULL){
i = nuevoAB();
d = nuevoAB();
tempo->dato=elem; // Al campo dato de la nueva estructura se le asigna elem
tempo->izq=i; // Al puntero izq de la nueva estructura se le hace apuntar al puntero de la arbol -lo conecta al arbol recibido
tempo->der=d; // Al puntero der de la nueva estructura se le hace apuntar al puntero de la arbol -lo conecta al arbol recibido
arbol=tempo; // Al puntero de la arbol, se le hace apuntar a la nueva memoria creada, con lo que se actualiza y se adiciona la nueva estructura creada
}
else
error(2);
}
else
error(1);
return arbol;
}
ArbolBin buscaAB(Elem elem,ArbolBin arbol){
ArbolBin tempo;
printf("-");
if(esVacioAB(arbol)) //error(5);
return(arbol);
else{
printf(".%i.",arbol->dato);
if(arbol->dato == elem){
tempo = arbol;
printf("Dato encontrado %i",elem);
return(tempo);
}
else{
if((tempo=buscaAB(elem,arbol->izq)) != NULL){
return(tempo);
}
else{
printf(".°.");
return(tempo=buscaAB(elem,arbol->der));
}
}
}
return(tempo);
}
void imprimeABp(ArbolBin arbol){
if(!esVacioAB(arbol))
{
printf("[ ");
printf(" {%i} ",arbol->dato);
printf(" <- ");
imprimeABp(arbol->izq);
printf(" -> ");
imprimeABp(arbol->der);
printf("]");
}
else{
printf("[ º ]");
}
}
int esVacioAB(ArbolBin arbol) {
return(!arbol);
}
ArbolBin recorreAB(ArbolBin arbol)
{
if(esVacioAB(arbol))
error(5);
return(arbol);
}
No hay comentarios:
Publicar un comentario