/***************************************************************************************************************************
CONSIGNA:
Escriba un programa que escriba una línea de texto y utilice una pila para imprimir por pantalla la línea invertida.
***************************************************************************************************************************/
// Librería estandar
#include <stdio.h>
#include <stdlib.h>
#define MAX_SIZE 128
// Estructura nodo
struct nodo_struct
{
char c; // Letra
struct nodo_struct *sig; // Nodo siguiente
};
// Tipos de datos
typedef struct nodo_struct new_nodo; // new_nodo creará un nuevo nodo tipo struct.
typedef new_nodo * ptr_nodo; // ptr_nodo creará un puntero a un nodo.
// Funciones
char strpos_(char str[], unsigned int pos);
char * strcat_(char str[], char c);
// Funciones de lista
void push(ptr_nodo *ptrHead, char letra); // Agrega un elemento a la lista.
char pop(ptr_nodo *ptrHead); // Saca un elemento de la lista.
int lista_isNull(ptr_nodo lista); // ¿Está vacía la lista?
// Main
int main(int argc, char *argv[])
{
// Declaramos las variables:
char str[MAX_SIZE]; // str: string conteniendo el texto original.
char m_str[MAX_SIZE]; // m_str: string conteniendo el texto invertido (modificado).
ptr_nodo ptrInicio = NULL; // ptrInicio: puntero al inicio de la lista.
int i; // i: contador.
// Inicio del programa, se solicita cargar un texto para invertir.
printf("Ingrese el texto a invertir: ");
scanf("%128[^\n]s", str);
// Se borra la pantalla para mostrar los resultados.
system("CLS");
// Cargamos la lista desde la variable str.
for(i = 0; i < strlen(str); i++)
{
push(&ptrInicio, strpos_(str, i));
}
// Mostramos el texto original.
printf("--> Su texto: %s\n", str);
// Descargamos la lista en la variable m_str.
while(!lista_isNull(ptrInicio))
{
strcat_(m_str, pop(&ptrInicio));
}
// Mostramos el texto invertido
printf("---> Texto invertido: %s\n", m_str);
system("PAUSE");
return 0;
}
// Funcion strpos_ devuelve el char de str[] en pos.
char strpos_(char str[], unsigned int pos)
{
return (char)str[pos];
}
// Función strcat_
char * strcat_(char str[], char c)
{
int i;
for(i = 0; str[i] != '\0'; i++);
str[i++] = c;
str[i] = '\0';
return str;
}
// Funciones de lista (pila):
// Funcion push (agregar un elemento a la lista)
void push(ptr_nodo *ptrHead, char letra)
{
ptr_nodo ptrNuevo;
ptrNuevo = malloc(sizeof(new_nodo));
if(ptrNuevo)
{
ptrNuevo->c = letra;
ptrNuevo->sig = *ptrHead;
*ptrHead = ptrNuevo;
}
else
printf("-> Error al insertar nuevo dato. Memoria insuficiente.\n");
}
// Funcion pop (quitar un elemento a la lista)
char pop(ptr_nodo *ptrHead)
{
ptr_nodo ptrTmp;
char ret;
ptrTmp = *ptrHead;
ret = (*ptrHead)->c;
*ptrHead = (*ptrHead)->sig;
free(ptrTmp);
return ret;
}
// ¿Está vacía la lista?
int lista_isNull(ptr_nodo lista)
{
return lista == NULL;
}
Comments