Ejemplos de C - Listas, pilas y colas

1.- Programa que lleva la gestión de los artículos de un almacén:

#include "stdio.h"
#include "string.h"
#include "stdlib.h"

struct art
{ int cod;
char nom[10];
long int exist;
};

int pedir_codigo();
int fbusqueda(struct art *part,int elem,int val);
void fcopiar(struct art *part,int elem);
void consultar(struct art *part,int elem);
void entradas(struct art *part,int elem);
void salidas(struct art *part,int elem);
void finalizar(struct art *part,int elem);
int menu();

void main()
{FILE *falmacen;
int i;
struct art articulos;
struct art *part;
int elementos;
int opc;
if ((falmacen=fopen("a:\\ficheros\\falmacen.d","rb"))==NULL)
{puts("\n Error de apertura de falmacen");
goto fin;
}
i=0;
fread((char*)&articulos,sizeof(struct art),1,falmacen);
while(!feof(falmacen))
{i++;
fread((char*)&articulos,sizeof(struct art),1,falmacen);
}
elementos=i;
part=(struct art*)malloc(elementos*sizeof(struct art));
if (part==NULL)
{puts("\n no hay memoria");
goto fin;
}
fcopiar(part,elementos);
do
{opc=menu();
switch(opc)
{case 1: consultar(part,elementos);
break;
case 2: entradas(part,elementos);
break;
case 3: salidas(part,elementos);
break;
case 4: finalizar(part,elementos);
break;
default :puts("\n Error al introducir opción");
}
}while(opc!=4);
fclose(falmacen);
fin:puts("\n");
}


int menu()
{int opcion;
puts("\n GESTION DE ALMACEN ");
puts("\n 1.- Consultar Existencias");
puts("\n 2.- Registrar entrada de existencias");
puts("\n 3.- Registrar salida de existencias");
puts("\n 4.- Finalizar");
puts("\n \n Teclee la opcion deseada");
scanf("%d",&opcion);
return(opcion);
}
void fcopiar(struct art *part,int elem)
{FILE *falmacen;
int i;
i=0;
if ((falmacen=fopen("a:\\ficheros\\falmacen.d","rb"))==NULL)
{puts("\n Error de apertura de falmacen");
goto fin;
}
for(i=0;i<elem;i++)
fread((char*)(part+i),sizeof(struct art),1,falmacen);
fclose(falmacen);
fin:puts("\n fin de la copia");
}

void consultar(struct art *part,int elem)
{ int valor;
int i;
valor=pedir_codigo();
i=fbusqueda(part,elem,valor);
if(i==-1)
puts("\n EL VALOR NO EXISTE");
else
{puts("\n los datos encontrados son: ");
printf("\nCODIGO : %d ",(part+i)->cod);
printf("\nNOMBRE: %s ",(part+i)->nom);
printf("\nEXISTENCIAS: %ld ",(part+i)->exist);
}
}

int pedir_codigo()
{ int valor;
puts("\n Teclee el codigo del articulo");
scanf("%d",&valor);
return(valor);
}

int fbusqueda(struct art *part,int elem, int val)
{int i=0;
while((part+i)->cod < val && i<elem-1) //mientras cod no encontrado y no ultimo elemento
i++;
if ((part+i)->cod==val)
return(i);
else
return(-1);
}

void entradas(struct art *part,int elem)
{int valor;
int i;
long int aux;
valor=pedir_codigo();
i=fbusqueda(part,elem,valor);
if(i==-1)
puts("\n El valor no existe");
else
{puts("\n los datos encontrados son: ");
printf("\nCÓDIGO: %d",(part+i)->cod);
printf("\nNOMBRE: %s",(part+i)->nom);
printf("\nEXISTENCIAS: %ld",(part+i)->exist);
puts("\n\n teclee las nuevas existencias: ");
scanf("%ld",&aux);
while(aux<=0)
{ puts("\n Debe ser mayor de cero");
puts("\n\n teclee las nuevas existencias: ");
scanf("%ld",&aux);
}
(part+i)->exist+=aux;
printf("\nLas EXISTENCIAS actuales son: %ld",(part+i)->exist);
}
}


void salidas(struct art *part,int elem)
{int valor;
int i;
long int aux;
valor=pedir_codigo();
i=fbusqueda(part,elem,valor);
if(i==-1)
puts("\n El valor no existe");
else
{puts("\n los datos encontrados son: ");
printf("\nCÓDIGO: %d",(part+i)->cod);
printf("\nNOMBRE: %s",(part+i)->nom);
printf("\nEXISTENCIAS: %ld",(part+i)->exist);
puts("\n\n teclee la salida de existencias: ");
scanf("%ld",&aux);
while(aux<=0)
{ puts("\n Debe ser mayor de cero");
puts("\n\n teclee las nuevas existencias: ");
scanf("%ld",&aux);
}
if(aux<=(part+i)->exist)
{(part+i)->exist-=aux;
printf("\n Las EXISTENCIAS actuales son: %ld",(part+i)->exist);
}
else
puts("\n No hay existencias para todas las salidas");
}
}


void finalizar(struct art *part,int elem)
{ FILE *falmacen;
int i=0;
if ((falmacen=fopen("a:\\ficheros\\falmacen.d","rb"))==NULL)
{puts("\n Error de apertura de falmacen");
goto fin;
}
for(i=0;i<elem;i++)
fwrite((char*)(part+i),sizeof(struct art),1,falmacen);
fclose(falmacen);
fin:puts("\n");
}

2.- Programa que lleva la gestión del personal de una empresa:

#include "stdio.h"
#include "string.h"
#include "stdlib.h"

struct empleados
{ int n_emple;
char nom[30];
char dir[30];
char cat;

};

struct lista
{
struct empleados reg;
struct lista *siguiente;

};




int fmenu();
void fcabecera();
void fconsultar(struct lista *primer);
struct lista *faltas(struct lista *primer);
struct lista *fbajas(struct lista *primer);
void fmodificaciones(struct lista *primer);
void fvisualizar(struct lista *primer);
void fin(struct lista *primer);
void fliberar(struct lista *primer);
struct lista *finicializar();



void main()

{

int opcion;
struct lista *primer=NULL;
primer=finicializar();
if(primer==NULL)
{ puts("\n NO HAY DATOS DE EMPLEADOS EN MEMORIA");
goto fin;
}


do
{
opcion=fmenu();
switch(opcion)
{
case 1: fconsultar(primer);
break;
case 2: primer=faltas(primer);
break;
case 3: primer=fbajas(primer);
break;
case 4: fmodificaciones(primer);
break;
case 5: fvisualizar(primer);
break;
case 6:fin(primer);
fliberar(primer);
break;
default: puts("\n opcion erronea");


}


}while(opcion!=5);

fin:puts("\n Fin del programa");
}




int fmenu()

{
int opcion;
puts("\n GESTION DE PERSONAL");
puts("\n----------------------");
puts("\n1.- CONSULTA DE EMPLEADOS");
puts("\n2.- ALTAS DE EMPLEADOS ");
puts("\n3.- BAJAS DE EMPLEADOS ");
puts("\n4.- MODIFICACIONES DE EMPLEADOS");
puts("\n5.- VISUALIZACION DE TODOS LOS EMPLEADOS");
puts("\n6.- FINALIZAR");
puts("\n TECLEE OPCION");
scanf("%d",&opcion);
return(opcion);

}

void fconsultar(struct lista *primer)
{
struct lista *aux;
char res;
int cod;
do
{
puts("introduce codigo a consultar: ");
scanf("%d", &cod);
aux=primer;
while(aux!=NULL && aux->reg.n_emple<cod)
aux=aux->siguiente;
if(aux!=NULL && aux->reg.n_emple==cod)
{
fcabecera();
printf("%d %s %s %c",cod,aux->reg.nom, aux->reg.dir, aux->reg.cat);
}

else printf("\nEl empleado %d no encontrado", cod);
puts("\nSi quieres seguir pulsa -s-");
fflush(stdin);
res=getchar();

}while(res=='s' || res=='S');
}



struct lista *faltas(struct lista *primer)
{
char res;
struct lista *nuevo;
struct lista *anterior;
struct lista *aux;

do
{
nuevo=(struct lista *) malloc (sizeof(struct lista));
if(nuevo==NULL)
{
puts("\n No hay suficiente memoria");
break;

}

puts("Teclee el codigo del empleado a dar de alta: \n");
scanf("%d", &nuevo->reg.n_emple);
puts("Teclee su nombre:\n");
fflush(stdin);
gets(nuevo->reg.nom);
puts("Teclee su direccion:\n");
fflush(stdin);
gets(nuevo->reg.dir);
puts("Teclee su categoria:");
fflush(stdin);
nuevo->reg.cat=getchar();


if(primer==NULL)
{
primer=nuevo;
nuevo->siguiente=NULL;
}
else
{
aux=primer;
while(aux!=NULL && aux->reg.n_emple<nuevo->reg.n_emple)
{
anterior=aux;
aux=aux->siguiente;
}

if(aux==NULL)
{
anterior->siguiente=nuevo;
nuevo->siguiente=NULL;
}

else
if(aux->reg.n_emple==nuevo->reg.n_emple)
printf("\n El empleado %d ya existe", nuevo->reg.n_emple);
else
if(aux==primer)
{
primer=nuevo;
nuevo->siguiente=aux;
}

else
{
anterior->siguiente=nuevo;
nuevo->siguiente=aux;
}

}

puts("\n ¿Quiere realizar el alta de otro empleado?");
fflush(stdin);
res=getchar();
}while(res=='s' || res=='S');
return(primer);
puts("\n Final del proceso de realizacion de altas");
}





struct lista *fbajas(struct lista *primer)
{
char res;
int aux;
struct lista *anterior;
struct lista *p_aux;
do
{
puts("\n Teclea numero de empleado a dar de baja:");
scanf("%d",&aux);
p_aux=primer;
while(p_aux!=NULL && p_aux->reg.n_emple<aux)
{
anterior=p_aux;
p_aux=p_aux->siguiente;
}
if(p_aux!=NULL && p_aux->reg.n_emple==aux)
{
printf("\n Se da de baja el empleado %d", aux);
if(p_aux==primer)
primer=p_aux->siguiente;
else
anterior->siguiente=p_aux->siguiente;
free(p_aux);
}

else
printf("\n El empleado %d que se quiere dar de baja no esta en memoria", aux);
puts("\n¿Quiere dar de baja otro empleado?");
fflush(stdin);
res=getchar();
}while(res=='s' || res=='S');
return(primer);
puts("\n final del programa de bajas");
}

void fcabecera()

{
puts("\nGESTION DE PERSONAL");
puts("\n--------------------");
puts("\nN.EMPLEADO NOMBRE DIRECCION CATEGORIA");
puts("\n---------- -------- ----------- ----------");

}


void fmodificaciones(struct lista *primer)
{
struct lista *aux;
char resp;
int cod;
do
{
puts("\nIntroduce codigo a modificar:");
scanf("%d",&cod);
aux=primer;
while(aux!=NULL && aux->reg.n_emple<cod)
aux=aux->siguiente;
if(aux!=NULL && aux->reg.n_emple==cod)
{
puts("\n ¿Quiere modificar direccion?");
fflush(stdin);
resp=getchar();
if(resp=='s' || resp=='S')
{puts("\n Teclee la direccion a modificar : ");
fflush(stdin);
gets(aux->reg.dir);
}
puts("\n ¿Quiere modificar la categoria?");
fflush(stdin);
resp=getchar();
if (resp=='s' || resp=='S')
{puts("\n Teclea la categoria a modificar");
fflush(stdin);
aux->reg.cat=getchar();
}
}
else
printf("\n Empleado %d no encontrado", cod);
puts("\n si quieres seguir pulsa-s-");
fflush(stdin);
resp=getchar();
}while(resp=='s' || resp=='S');
}



void fvisualizar(struct lista *primer)
{
struct lista *actual;
fcabecera();
actual=primer;
while(actual!=NULL)
{
printf("\n %d % s %s %c", actual->reg.n_emple, actual->reg.nom, actual->reg.dir, actual->reg.cat);
actual=actual->siguiente;
}

puts("\n Fin de la funcion visualizar");
}

void fin(struct lista *primer)
{
struct lista *actual;
struct empleados emple;
FILE *empleados;
if((empleados=fopen("a:\\ficheros\\femple.d","wb"))==NULL)
{
puts("\n Error al abrir empleados");
goto fin;
}
actual=primer;
while(actual!=NULL)
{
emple.n_emple=actual->reg.n_emple;
strcpy(emple.nom, actual->reg.nom);
strcpy(emple.dir, actual->reg.dir);
emple.cat=actual->reg.cat;
fwrite(&emple, sizeof(emple), 1, empleados);
actual=actual->siguiente;
}

fclose(empleados);
fin:puts("\n Fin de la funcion");
}


void fliberar(struct lista *primer)
{
struct lista *nuevo;
struct lista *p_aux;
nuevo=primer;
while(nuevo!=NULL)
{
p_aux=nuevo->siguiente;
free(nuevo);
nuevo=p_aux;
}

puts("\nYa se ha liberado memoria");


}


struct lista *finicializar()
{
struct empleados emple;
struct lista *nuevo, *anterior, *primer=NULL;
FILE *femple;
if((femple=fopen("a:\\ficheros\\femple.d","rb"))==NULL)
{
puts("\n Error al abrir empleados");
goto fin;
}

fread(&emple, sizeof(emple), 1, femple);
while(!feof(femple))
{
nuevo=malloc(sizeof(struct lista));
if(nuevo==NULL)
{
puts("\nNo hay memoria para leer la lista");
break;
}

nuevo->reg.n_emple=emple.n_emple;
strcpy(nuevo->reg.nom,emple.nom);
strcpy(nuevo->reg.dir,emple.dir);
nuevo->reg.cat=emple.cat;
nuevo->siguiente=NULL;
if(primer==NULL)
primer=nuevo;
else
anterior->siguiente=nuevo;
anterior=nuevo;
fread(&emple, sizeof(emple), 1, femple);
}

fclose(femple);
fin:return(primer);
puts("\n Fin de la funcion finicializar");

}



VOLVER

A PROGRAMAR © 2002. All Rights Reserved.
Hosted by www.Geocities.ws

1