/* Ordena un fichero de pedidos utilizando una árbol binario */ #include #include #include /* Estructura del registro */ typedef struct{ char cod_cli[7]; // Código de cliente char cod_art[7]; // Código de articulo char fecha [9]; // Fecha del pedido short unidades; //si unidades = 0 el registro esta borrado y no se debe ordenar }tipopedido; struct sele { tipopedido valor; struct sele *dcha; struct sele *izda; }; typedef struct sele Elemento; Elemento *Raiz = NULL; FILE *pped; // Fichero de pedidos FILE *pord; // Fichero de pedidos ordenados /*-------------------------------------------------------*/ /* Inserta ordenadamente un elemento en el árbol */ /*-------------------------------------------------------*/ Elemento * Insertar ( Elemento *parbol, tipopedido dato ) { Elemento *paux; paux = parbol; if ( paux == NULL ) { paux = malloc ( sizeof ( Elemento ) ); if ( paux != NULL ) { paux->valor = dato; paux->dcha = NULL; paux->izda = NULL; } } else { if ( strcmp(dato.cod_cli,paux->valor.cod_cli) > 0 ) { paux->dcha = Insertar( paux->dcha,dato); } else { paux->izda = Insertar (paux->izda,dato); } } return paux; } /*-------------------------------------------------------*/ /* Abre los ficheros devolviendo 1 si exito o 0 si fallo */ /*-------------------------------------------------------*/ int AbrirFicheros( void ) { pped=fopen("PEDIDOS.DAT","r"); pord=fopen ("PEDORD.DAT","w"); if ((pped==NULL)||(pord==NULL)) { return (0); } return 1; } /*-------------------------------------------------------*/ /* Carga en el árbol los registros del fichero de pedidos */ /*-------------------------------------------------------*/ void CargarArbol( void ) { tipopedido reg; fread(®,sizeof(tipopedido),1,pped); while (!feof(pped)) { // Si la unidades son igual a cero se supone que es un registro eliminado if (reg.unidades!=0) { Raiz = Insertar(Raiz,reg); } fread(®,sizeof(tipopedido),1,pped); } } void GrabarInOrden( Elemento *parbol ) { if ( parbol != NULL ) { GrabarInOrden(parbol->izda); fwrite(& (parbol->valor), sizeof(tipopedido),1,pord); GrabarInOrden(parbol->dcha); } } /*-----------------------------------------------------------------*/ /* Vuelca el contenido de la tabla ordenada al fichero PEDORD.DAT */ /*-----------------------------------------------------------------*/ void VolcarArbol( void ) { GrabarInOrden(Raiz); } /*---------------------------*/ /* Cierra ambos ficheros */ /*--------------------------*/ void CerrarFicheros( void ) { fclose(pped); fclose(pord); } /*-------------------------*/ /* FUNCIÓN PRINCIPAL main */ /*-------------------------*/ int main(void) { if ( AbrirFicheros()==0) { puts ("No se puede ordenar"); return(1); } CargarArbol(); VolcarArbol(); CerrarFicheros(); puts(" Fin del proceso ."); getchar(); return 0; }