domingo, 22 de julio de 2012

Programación: Pilas en lenguaje C

Bienvenidos


 Pilas




Las pilas son estructuras de datos que el modo de entrada a cualquier elementos es por un LIFO (Entra de ultimo y sale de primero ), permite almacenar y recuperar datos. Se aplica en
multitudes de casos, ya que se debe a su simplicidad y ordenamiento propia de la estructura.




Operaciones básicas de pilas

Las operaciones Básicas de pilas son las siguientes:


  • Apilar: Incrementa la cima de la pila en 1 y asigna el nuevo elemento a la lista de la pila

  • Desapilar: Copia primero el valor de cima de la pila en una variable local auxiliar, y a se presenta un decremento de la cima de la pila en 1. 


  • Inicializar pila: Vacia integramente la pila, para lo que pone cima al valor que se corresponda con pila vacia (-1).

  • Pila llena:  Verificar si la cima es -1. en ese caso la pila esta llena y se devuelve un 1 verdadero, en caso contrario, se devuelve en falso.



  • Pila vacía:  Verifica si la cima de la pila es -1. en este caso la pila vacia se devuelve un 1 en caso de ser verdadero de lo contrario falso 



  • Cima: Devuelve el elemento que se encuentra en la cima de la pila, no se modifica la pila.



Implemantacion



Implementacion mediante array o listas enlazadas. es una implementacion estática que se 
realiza utilizando un array de  un tamaño fijo pero con una Implementacion dinámica mediante listas enlazadas.



Ejercicio

#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>

struct productos
{
    int codigo;
    char nombre[50];
    int existencia;
    float precio;
};

struct nodo
{
    struct productos dato;
    struct nodo *proximo;
};

/* Declaracion de funciones */
void archivo(FILE *fp);
struct nodo *nuevonodo();
struct nodo *creapila(struct nodo *pri, struct productos x);
void muestra(struct nodo *pri, FILE *fp);
/* Fin de Declaracion */

main()
{
    struct productos x;
    struct nodo *pri=NULL;
    FILE *fp;
    char opcion; float auxiliar=0;
    if((fp=fopen("C:\\Datos.txt","wb"))==NULL)
    {
        getch();
    }
    fseek(fp,0,2);
    do
    {
        fflush(stdin);
        printf("Ingrese el Codigo de Producto ");
        scanf("%d",&x.codigo);
        fflush(stdin);
        printf("Ingrese Nombre de Producto ");
        gets(x.nombre);
        fflush(stdin);
        printf("Ingrese la Existencia ");
        scanf("%d",&x.existencia);
        fflush(stdin);
        printf("Ingrese el Precio ");
        scanf("%f",&auxiliar); x.precio=auxiliar;
        pri=creapila(pri,x);
        fflush(stdin);
        printf("Desea Ingresar otro Registro? (S/N) ");
        scanf("%c",&opcion); opcion=toupper(opcion);
    } while(opcion=='S');
    muestra(pri,fp);
    fflush(stdin);
    printf("El contenido de la Pila se ha Guardado. Desea Visualizarlo? (S/N)");
    scanf("%c",&opcion); opcion=toupper(opcion);
    if(opcion=='S') archivo(fp);
    getch();
    fclose(fp);
}

struct nodo *creapila(struct nodo *pri, struct productos x)
{
    struct nodo *p;
    p=nuevonodo();
    (*p).dato=x;
    (*p).proximo=pri;
    return p;
}

struct nodo *nuevonodo()
{
    struct nodo *p;
    p=(struct nodo *)malloc(sizeof(struct nodo));
    if(p==NULL)
    {
        printf("Memoria RAM Llena");
        getch();
        exit(0);
    }
    return p;
}

void muestra(struct nodo *pri, FILE *fp)
{
    struct nodo *aux;
    while(pri!=NULL)
    {
        printf("Codigo: %d \n",(*pri).dato.codigo);
        printf("Nombre: %s \n",(*pri).dato.nombre);
        printf("Existencia: %d \n",(*pri).dato.existencia);
        printf("Precio: %0.2f \n\n",(*pri).dato.precio);
        fwrite(&pri->dato,sizeof(struct productos),1,fp);
        aux=pri;
        pri=(*pri).proximo;
        free(aux);
    }
}

void archivo(FILE *fp)
{
    struct productos x;
        printf("Datos del Archivo:\n\n");
    fread(&x,sizeof(struct productos),1,fp);
    while(!feof(fp))
    {
        printf("Codigo: %d \n",x.codigo);
        printf("Nombre: %s \n",x.nombre);
        printf("Existencia: %d \n",x.existencia);
        printf("Precio: %0.2f \n\n",x.precio);
        fread(&x,sizeof(struct productos),1,fp);
    }
    printf("Fin de Archivo");
}


























3 comentarios: