/* ------------------------------------------------------------ * UTILIZACIÓN DE UNA PILA PARA MOSTRAR LAS LINEAS DE UN FICHERO EN ORDEN INVERSO * ------------------------------------------------------------ */ #include //#include #include typedef enum {FALSE=0,TRUE=1} boolean; /* Tipo de dato que almacena cada elemento de la lista */ /* en este caso es un puntero a una cadena de caracteres */ typedef char * TipoDato; /* Estructura autoreferenciada */ struct SEle{ TipoDato valor; struct SEle *sig; }; typedef struct SEle Elemento; Elemento *Base; /*----------------------------------------------------------------*/ /* FUNCIONES DE MANEJO DE PILA */ /* Inicializa el puntero de la Lista */ void PilaIniciar(void) { Base = NULL; } /* -------------------------- */ /* Indica si está o no vacia */ /* -------------------------- */ boolean PilaVacia(void) { return ( Base == NULL)?TRUE:FALSE; } /*------------------------------- */ /* Pone un elemento en la pila */ /*------------------------------- */ boolean PilaPon ( TipoDato Dato) { Elemento *pnuevo; boolean resu; resu = FALSE; pnuevo = (Elemento *) malloc( sizeof(Elemento) ); if ( pnuevo != NULL ) { pnuevo->sig = Base; pnuevo->valor = Dato; Base = pnuevo; resu = TRUE; } return resu; } /*-------------------------------- */ /* Extrae un elemento de la Pila */ /*------------------------------- */ boolean PilaSaca( TipoDato *pdato) { Elemento *paux; if ( PilaVacia() ) { return FALSE; } else { paux = Base; Base = Base->sig; *pdato = paux->valor; free(paux); return TRUE; } } /* Program principal */ int main(int argc, char *argv[]) { FILE *fp; char linea[256]; char * cadena; PilaIniciar(); 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); while ( !feof(fp) ) { // Almaceno la cadena en memoria dinámica cadena = (char *) malloc ( strlen(linea)+1); strcpy(cadena,linea); PilaPon(cadena); fgets(linea,255,fp); } // Extraigo valores de la pila while ( !PilaVacia() ) { PilaSaca( & cadena); printf("%s",cadena); // Libero el espacio ocupado por la cadena free(cadena); } }