/* ------------------------------------------------------------ */ /* IMPLEMENTACION DE FUNCIONES BASICAS UNA COLA FIFO (First Input First Output ) MEDIANTE UNA TABLA Primero en entrar, primero en salir. Funciones: ColaIniciar ( void ) ColaPon ( TipoDato Dato ); ColaSaca ( TipoDato * Dato ); ColaVacia ( void ) ColaVer ( void ) * ------------------------------------------------------------ */ #include //#include #define MAXNUMCOLA 50 // Máximo número de elementos en la cola typedef enum {FALSE=0,TRUE=1} boolean; /* Tipo de dato que almacena cada elemento de la lista */ typedef char * TipoDato; TipoDato COLA[ MAXNUMCOLA ]; // Tabla donde guardo los valores en Cola int Iprimero; // Índice al primer elemento int Iultimo; // Índice al ultimo int numelementos; // Número de elementos en cola /* --------------------------------- */ /* Inicializa el puntero de la Cola */ /* --------------------------------- */ void ColaIniciar(void) { Iprimero = 0; Iultimo = 0; numelementos = 0; } /*--------------------------- */ /* Indica si esta o no vacia */ /*--------------------------- */ boolean ColaVacia(void) { return ( numelementos == 0)?TRUE:FALSE; } /* ------------------------------------------- */ /* Pone un nuevo elemento al final de la Cola */ /* ------------------------------------------- */ boolean ColaPon ( TipoDato Dato) { boolean resu; resu = FALSE; if ( numelementos < MAXNUMCOLA ) { numelementos ++; COLA [ Iultimo ] = Dato; Iultimo ++; Iultimo = ( Iultimo % MAXNUMCOLA ); resu = TRUE; } return resu; } /*-------------------------------------*/ /* Saca el primer elemento de la Cola */ /*-------------------------------------*/ boolean ColaSaca( TipoDato *pdato) { if ( ColaVacia() ) { return FALSE; } else { *pdato = COLA[Iprimero]; Iprimero++ ; numelementos-- ; Iprimero = Iprimero % MAXNUMCOLA; return TRUE; } } /* ---------------------------------- */ /* Muestra el contenido de la cola */ /* ---------------------------------- */ void ColaVer ( void ) { int i; // Contador int pos; // Nº de elementos en la tabla printf("\n COLA: ["); pos = Iprimero; for (i=0;i < numelementos ; i++) { printf("->%s ", COLA[pos]); pos++; pos = pos % MAXNUMCOLA; } printf("]\n"); } /* Prueba de Funciones */ int main(int argc, char *argv[]) { FILE *fp; char linea[256]; char * cadena; int nl; ColaIniciar(); if ( argc == 2 ) { fp = fopen(argv[1],"r"); } else { // Si no hay parámetros leo de la entrada estándar fp = stdin; } fgets(linea,255,fp); nl = 0; while ( !feof(fp) ) { // Almaceno la cadena en memoria dinámica cadena = (char *) malloc ( strlen(linea)+1); strcpy(cadena,linea); ColaPon(cadena); nl++; // Solo guardo cinco como máximo if ( nl > 5 ) { ColaSaca( &cadena); free(cadena); } fgets(linea,255,fp); } ColaVer(); }