/* ------------------------------------------------------------ */ /* IMPLEMENTACION DE FUNCIONES BASICAS UNA COLA FIFO (First Input First Output ) Primero en entrar, primero en salir. Funciones: ColaIniciar ( void ) ColaPon ( TipoDato Dato ); ColaSaca ( TipoDato * Dato ); ColaVacia ( void ) ColaVer ( void ) * ------------------------------------------------------------ */ #include //#include typedef enum {FALSE=0,TRUE=1} boolean; /* Tipo de dato que almacena cada elemento de la lista */ typedef char * TipoDato; /* Estructura autoreferenciada */ struct SEle{ TipoDato valor; struct SEle *sig; }; typedef struct SEle Elemento; /* Variable global Puntero de Inicio de la Lista */ Elemento *Base; /* --------------------------------- */ /* Inicializa el puntero de la Cola */ /* --------------------------------- */ void ColaIniciar(void) { Base = NULL; } /*--------------------------- */ /* Indica si esta o no vacia */ /*--------------------------- */ boolean ColaVacia(void) { return ( Base == NULL); } /* ------------------------------------------- */ /* Pone un nuevo elemento al final de la Cola */ /* ------------------------------------------- */ boolean ColaPon ( TipoDato Dato) { Elemento *p,*paux; paux = ( Elemento *) malloc ( sizeof( Elemento)); if ( paux == NULL) { return FALSE; } paux->sig = NULL; paux->valor = Dato; if ( Base == NULL ) { Base = paux; } else { p = Base; while (p->sig != NULL ) { p = p->sig; } p->sig = paux; } return TRUE; } /*-------------------------------------*/ /* Saca el primer elemento de la Cola */ /*-------------------------------------*/ boolean ColaSaca( TipoDato *pdato) { Elemento *paux; if ( ! ColaVacia() ) { *pdato = Base->valor; paux = Base; Base = Base->sig; free(paux); return TRUE; } return FALSE; } /* ---------------------------------- */ /* Muestra el contenido de la cola */ /* ---------------------------------- */ void ColaVer ( void ) { Elemento *paux; printf("\n LISTA: ["); paux = Base; while ( paux != NULL ) { printf("->%s ",paux->valor); paux = paux->sig; } printf("]\n"); } 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(); }