#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <string.h>
struct Persona
{
char nombre[30];
char ap1[30];
char ap2[30];
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);
main()
{
system("color 17");
Persona * agenda;
int op;
agenda = NULL;
op = -1;
cargar (&agenda);
while (op!=0)
{
menu();
op = getch()-'0';
clrscr();
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;
}
}
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 0.- FIN");
printf("\n ");
}
void menu2(void)
{
clrscr();
printf("\n 1.- Nombre");
printf("\n 2.- Apellido1");
printf("\n 3.- Apellido2");
printf("\n 4.- 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 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.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)
{
if (ag != NULL)
{
escribirReg(*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 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 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 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 ("agenda.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("agenda.dat","agenda.bck");
f=fopen("agenda.dat","wb");
if (f==NULL)
{
printf("\n Error");
return;
}
while (ag!= NULL)
{
fwrite(ag, sizeof(Persona),1,f);
ag = ag->sig;
}
fclose(f);
}
Estoy estudiando como solucionarlo.
Gracias.