miércoles, 1 de junio de 2011

APUNTE ARBOL

/*    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