#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <windows.h>
struct pilanodo {
int clave;
char descrip[20];
struct pilanodo *sigptr;
};
typedef struct pilanodo PILANODO;
typedef PILANODO *PILANODOPTR;
void push(PILANODOPTR *, int, char[]);//declaración o prototipo de función
void instrucciones(void);//declaración o prototipo de función
void listar (PILANODOPTR);
int pop (PILANODOPTR *);
main()
{ PILANODOPTR pilaptr = NULL;//apuntador con valor nulo
int opcion/*para el menu*/, cve;
char desc[20];
instrucciones();//llamado a función instrucciones que despliegan el menu
printf("\n Elige opcion: ");
scanf("%d", &opcion);
while (opcion != 4)
{ switch(opcion)
{ case 1: printf("\n Escribe la clave del articulo (entero): ");
scanf("%d", &cve);
fflush(stdin);//funcion para limpiar el buffer de captura
printf("\n Escribe la descripcon del articulo: ");
gets(desc);//capturar un string
push(&pilaptr, cve, desc);
break;
case 2:
pop(&pilaptr);
break;
case 3:
listar (pilaptr);
break;
default : printf("\n Opcion no permitida. \n\n");
printf("\n Enter para continuar...");
getch();
instrucciones();
}
instrucciones();
printf("\n Elige opcion: ");
scanf("%d", &opcion);
}
printf("\n Fin del programa.\n\n");
printf(" Enter para salir...");
getch();
}
void push(PILANODOPTR *topeptr, int cve, char des[20])//lista de parametros con declaración de variables
{ PILANODOPTR nuevoptr;//declaración de apuntador nuevoptr
nuevoptr = (PILANODOPTR) malloc(sizeof(PILANODO));//al apuntador nuevoptr le asignamos el tamaño de la estructura PILANODO
if (nuevoptr != NULL)//si nuevoptr encontro espacio en memoria
{ nuevoptr->clave = cve;//nuevoptr que apunta a clave le asignamos el valor de cve
strcpy(nuevoptr->descrip, des);/*función de copiado de cadenas, al miembro descrip que esta siendo apuntado por nuevoptr
le copiamos la cadena con nombre des*/
nuevoptr->sigptr = *topeptr;/*sigptr que esta siendo apuntado por nuevoptr le asignamos el valor de topeptr, el cual apunta
al tope de la pila*/
*topeptr = nuevoptr;//al apuntador topeptr le asignamos el valor de nuevoptr
}
else
{ printf("\n %d %s, no fue insertado."
"\n No hay memoria disponible. \n", cve, des);
printf("\n Enter para continuar...");
getch();
}
}
void instrucciones(void)
{ system("cls");
printf(" \n\n\n\n"
" OPERACIONES DISPONIBLES CON LA PILA: \n\n\n\n"
" 1 (push) INSERTAR UN VALOR EN LA PILA \n"
" 2 (pop) EXTRAER UN VALOR DE LA PILA \n"
" 3 IMPRIMIR LA PILA \n"
" 4 SALIR DEL PROGRAMA \n");
}
void listar (PILANODOPTR auxptr)
{
if (auxptr==NULL)
printf("\n\nla pila esta vacia");
else
{ while(auxptr!=NULL)
{
printf("\n %d %s", auxptr->clave, auxptr->descrip);
auxptr= auxptr->sigptr;
}
printf("\n fondo de la pila\n");
}
getch();
}
int pop (PILANODOPTR *topeptr)
{
PILANODOPTR auxptr;
auxptr=*topeptr;
if(auxptr==NULL)
{
printf("\nno hay elementos en la pila");
}
else
{
if(auxptr!=NULL)
{
printf("%i--%s", auxptr->clave, auxptr->descrip);
(*topeptr)=auxptr->sigptr;
free(auxptr);
}
}
getch();
}