#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <string.h>
/*struct Fecha
{
int dia, mes, anio;
}; */
struct Persona
{
char nombre[30];
char ap1[30];
char ap2[30];
char tfnocasa[9];
char tfnomovil[9];
char email[30];
char direccion[30];
char codpostal[10];
char provincia[15];
char dni[20];
int edad;
Persona * sig;
};
void altas (Persona ** pag);
void anadir (Persona * ag, Persona * r);
void listado (Persona * ag);
void listadoInverso (Persona * reg);
void leerReg (Persona * r);
void menu(void);
void escribirReg (Persona r);
void cargar(Persona ** ag);
void guardar(Persona * ag);
void bajas (Persona ** pag);
Persona * buscar (Persona * act, Persona ** ant);
/* void iniciar(Persona * p); */
void consulta(Persona * ag);
void modificar(Persona * ag);
void limpiarpantalla(Persona * ag);
main()
{
Persona * agenda;
int op;
agenda = NULL;
op = -1;
cargar (&agenda);
while (op!=0)
{
menu();
op = getch()-'0';
switch(op)
{
case 1: altas(&agenda); break;
case 2: listado (agenda); getch(); break;
case 3: listadoInverso (agenda); getch(); break;
case 4: bajas(&agenda); getch(); break;
case 5: consulta(agenda); getch(); break;
case 6: modificar(agenda);getch();break;
case 7: guardar(agenda);break;
case 8: limpiarpantalla(agenda);break;
}
}
guardar(agenda);
}
void menu(void)
{
clrscr();
printf("\n * MENU PRINCIPAL *");
printf("\n");
printf("\n 1.- Altas");
printf("\n 2.- Listado");
printf("\n 3.- ListadoInverso");
printf("\n 4.- Bajas");
printf("\n 5.- Consulta");
printf("\n 6.- Modificar");
printf("\n 7.- Guardar");
printf("\n 8.- Limpiarpantalla");
printf("\n 0.- FIN");
}
void menu2(void)
{
clrscr();
printf("\n 1.- Nombre");
printf("\n 2.- Apellido1");
printf("\n 3.- Apellido2");
printf("\n 4.- Tfno Casa");
printf("\n 5.- Tfno Movil");
printf("\n 6.- Email");
printf("\n 7.- Direccion");
printf("\n 8.- Cod.Postal");
printf("\n 9.- Provincia");
printf("\n 10.- DNI");
printf("\n 11.- Edad");
// printf ("\n Campo siguiente a NULL");
getch();
fflush(stdin);
}
void altas (Persona ** pag)
{
Persona * reg;
reg = (Persona*) malloc(sizeof(Persona));
leerReg (reg);
if (*pag == NULL)
{
*pag = reg;
return;
}
anadir(*pag,reg);
}
void bajas (Persona ** pag)
{
Persona * x;
Persona * ant;
if (*pag == NULL)
{
printf("La lista enlazada esta vacia\n");
return;
}
x = buscar(*pag, &ant);
if (x == NULL)
{
printf("Dato no encontrado ");
return;
}
// si es el primero, cambiar cabeza
if (x==*pag)
{
*pag = (*pag)->sig;
printf("Dado de baja registro");
escribirReg(*x);
free(x);
return;
}
ant->sig = x->sig;
free(x);
return;
}
/*void iniciar (Persona * p)
{
strcpy(p->nombre,"##");
strcpy(p->ap1,"##");
strcpy(p->ap2,"##");
p->edad = 0;
p->sig = NULL;
} */
Persona * buscar (Persona * act, Persona ** ant)
{
//bool NoEncontrado = true;
int op;
char sn;
Persona aux;
menu2();
/* iniciar(&aux); */
op = getch()- '0';
switch(op)
{
case 1:printf("\n Introduce nombre a buscar");
gets(aux.nombre);
break;
case 2:printf("\n Introduce apellido 1 a buscar");
gets(aux.ap1);
break;
case 3:printf("\n Introduce apellido 2 a buscar");
gets(aux.ap2);
break;
case 4:printf("\n Introduce telefono de casa");
gets(aux.tfnocasa);
fflush(stdin);break;
case 5:printf("\n Introduce telefono movil");
gets(aux.tfnomovil);
fflush(stdin);break;
case 6:printf("\n Introduce email ó direccion electronica");
gets(aux.email);
fflush(stdin);break;
case 7:printf("\n Introduce direccion");
gets(aux.direccion);
fflush(stdin);break;
case 8:printf("\n Introduce codigo postal");
gets(aux.codpostal);
fflush(stdin);break;
case 9:printf("\n Introduce provincia");
gets(aux.provincia);
fflush(stdin);break;
case 10:printf("\n Introduce DNI");
scanf("%f",aux.dni);
fflush(stdin);break;
case 11:printf("\n Introduce edad a buscar");
scanf("%d",&aux.edad);
fflush(stdin);break;
}
while (act!=NULL)
{
if ((strncmp(aux.nombre,act->nombre,strlen(aux.nombre))==0)||
(strncmp(aux.ap1,act->ap1,strlen(aux.ap1))==0) ||
(strncmp(aux.ap2,act->ap2,strlen(aux.ap2))==0) ||
(aux.tfnocasa == act->tfnocasa) ||
(aux.tfnomovil == act->tfnomovil) ||
(strncmp(aux.email,act->email,strlen(aux.email))==0) ||
(strncmp(aux.direccion,act->direccion,strlen(aux.direccion))==0) ||
(strncmp(aux.codpostal,act->codpostal,strlen(aux.codpostal))==0) ||
(strncmp(aux.provincia,act->provincia,strlen(aux.provincia))==0) ||
(aux.dni == act->dni) ||
(aux.edad == act->edad ))
{
escribirReg(*act);
printf("\n Registro encontrado (S/N): ");
sn = (char)getch();
if (sn== 'S' || sn=='s')
return act;
*ant = act;
act = act->sig;
}
}// fin while
return act; // act tiene NULL
}
void anadir (Persona * ag, Persona * r)
{
if(ag->sig == NULL)
{
ag->sig = r;
return;
}
else
anadir(ag->sig,r);
}
void listado(Persona * ag)
{
int contador;
contador = 1;
if (ag != NULL)
{
escribirReg(*ag);
/* printf("\n REGISTRO Nº",contador);
contador++;
limpiarpantalla(*ag); */
listado(ag->sig);
}
else
printf("\n FIN LISTADO");
}
void listadoInverso (Persona * reg)
{
if (reg == NULL)
{
printf("\n Empieza el listado");
return;
}
else
{
listadoInverso(reg->sig);
escribirReg(*reg);
}
}
void leerReg (Persona * r)
{
fflush(stdin);
printf("\n Introduce nombre: ");
gets(r->nombre);
//getch();
printf("\n Introduce apellido 1: ");
gets(r->ap1);
printf("\n Introduce apellido 2: ");
gets(r->ap2);
printf("\n Introduce tfno de casa");
gets(r->tfnocasa);
// scanf("%f",& r->tfnocasa);
printf("\n Introduce tfno movil");
gets(r->tfnomovil);
// scanf("%f",& r->tfnomovil);
printf("\n Introduce email");
gets(r->email);
printf("\n Introduce direccion");
gets(r->direccion);
// fflush(stdin);
printf("\n Introduce codigo postal");
gets(r->codpostal);
// fflush(stdin);
printf("\n Introduce provincia");
gets(r->provincia);
// fflush(stdin);
printf("El DNI es:");
gets(r->dni);
// scanf("%d",& r->dni);
// fflush(stdin);
printf("Introduce edad: ");
scanf("%d",& r->edad);
// fflush(stdin);
r->sig=NULL;
}
void escribirReg (Persona r)
{
printf("\n DATOS REGISTRO... ");
printf("\n El nombre es : %s",r.nombre);
printf("\n El apellido primero es : %s",r.ap1);
printf("\n El apellido segundo es : %s",r.ap2);
printf("\n El telefono de casa es : %s",r.tfnocasa);
printf("\n El telefono movil es : %s",r.tfnomovil);
printf("\n El email es : %s",r.email);
printf("\n La direccion es : %s",r.direccion);
printf("\n El codigo postal es : %s",r.codpostal);
printf("\n La provincia es : %s",r.provincia);
printf("\n El DNI es : %s",r.dni);
printf("\n La edad es : %d",r.edad);
}
void consulta(Persona * ag)
{
Persona * x;
Persona * ant;
if (ag == NULL)
{
printf("La lista enlazada esta vacia \n");
return;
}
x = buscar(ag,&ant);
if (x == NULL)
{
printf("Dato no encontrado");
return;
}
else
{ printf("\n Encontrado registro");
escribirReg(*x);
printf("\n Fin consulta");
}
}
void modificar (Persona * ag)
{
Persona * x;
Persona * ant;
Persona aux;
/* iniciar(&aux); */
if (ag == NULL)
{
printf("La lista esta vacia\n");
return;
}
x = buscar(ag,&ant);
if (x == NULL)
{
printf("Dato no encontrado");
return;
}
else
{
printf("\n Encontrado registro");
escribirReg(*x);
printf("Nombre antiguo: %s. \n Introduce nombre a modificar: ",x->nombre);
gets(aux.nombre);
if (strlen(aux.nombre)>0)
strcpy(x->nombre,aux.nombre);
printf("\n Nombe nuevo: %s.",x->nombre);
printf("Nombre antiguo: %s. \n Introduce apellido 1 a modificar: ",x->ap1);
gets(aux.ap1);
if (strlen(aux.ap1)>0)
strcpy(x->ap1,aux.ap1);
printf("\n Apellido 1 nuevo: %s.",x->ap1);
printf("Nombre antiguo: %s. \n Introduce apellido 2 a modificar: ",x->ap2);
gets(aux.ap2);
if (strlen(aux.ap2)>0)
strcpy(x->ap2,aux.ap2);
printf("\n Apellido 2 nuevo: %s.",x->ap2);
printf("Nombre antiguo: %d \n Introduce tfnocasa: ",x->tfnocasa);
gets(aux.tfnocasa);
if (strlen(aux.tfnocasa)>0)
strcpy(x->tfnocasa,aux.tfnocasa);
printf("\n Telefono nuevo: %d.",x->tfnocasa);
printf("Nombre antiguo: %d \n Introduce tfnomovil: ",x->tfnomovil);
gets(aux.tfnomovil);
if (strlen(aux.tfnomovil)>0)
strcpy(x->tfnomovil,aux.tfnomovil);
printf("\n Telefono nuevo: %d.",x->tfnomovil);
printf("Nombre antiguo: %s. \n Introduce email: ",x->email);
gets(aux.email);
if (strlen(aux.email)>0)
strcpy(x->email,aux.email);
printf("\n Email nuevo: %s.",x->email);
printf("Nombre antiguo: %s. \n Introduce direccion: ",x->direccion);
gets(aux.direccion);
if (strlen(aux.direccion)>0)
strcpy(x->direccion,aux.direccion);
printf("\n Apellido 2 nuevo: %s.",x->direccion);
printf("Nombre antiguo: %s. \n Introduce provincia: ",x->provincia);
gets(aux.provincia);
if (strlen(aux.provincia)>0)
strcpy(x->provincia,aux.provincia);
printf("\n Nueva provincia: %s.",x->provincia);
printf("Nombre antiguo: %d \n Introduce dni: ",x->dni);
gets(aux.dni);
if (strlen(aux.dni)>0)
strcpy(x->dni,aux.dni);
printf("\n Edad nueva: %d.",x->dni);
printf("Nombre antiguo: %d \n Introduce edad: ",x->edad);
scanf("%d",&aux.edad);
if (aux.edad != 0)
x->edad = aux.edad;
printf("\n Edad nueva: %d.",x->edad);
printf("\n FIN MODIFICACIONES. ");
}
}
void cargar(Persona ** pag)
{
FILE *f;
Persona reg, *nuevo;
Persona *act;
f=fopen ("datos.dat","rb");
if (f==NULL)
{
fprintf(stderr,"fichero no encontrado");
return;
}
// float ss;
// int i = 0;
fread(®, sizeof(Persona), 1 ,f);
nuevo = (Persona *) malloc (sizeof(Persona));
* nuevo = reg;
* pag = nuevo; act = * pag;
fread(®, sizeof(Persona), 1 ,f);
while(!feof(f))
{
nuevo = (Persona *) malloc (sizeof(Persona));
* nuevo = reg;
act-> sig = nuevo;
act = act->sig;
fread(®, sizeof(Persona), 1 ,f);
}
fclose(f);
act->sig = NULL;
}
void guardar(Persona *ag)
{
FILE * f;
if (ag==NULL) return;
rename("datos.dat","datos.bck");
f=fopen("datos.dat","wb");
if (f==NULL)
{
printf("\n Error");
return;
}
while (ag!= NULL)
{
fwrite(ag, sizeof(Persona),1,f);
ag = ag->sig;
}
fclose(f);
}
void limpiarpantalla(Persona *ag)
{
int i;
i = 1;
for (i==1;i<= 80;i++)
{
printf("\n ");
}
}
Comentarios sobre la versión: Versión 1.0 (0)
No hay comentarios