int menu(void);
void ingresarCadena(char[], int, char[]); /* Esta función permite ingresar una cadena de texto controlando su longitud y eliminando el '\n' */
/* Podría reemplazarse por gets() */
void guardarArchText(pNodo);
void leerArchTxt(pNodo*);
void liberarMemoria(pNodo*);
int main(void)
{
int opc;
pNodo inicio; /* Puntero para la lista enlazada */
inicio = NULL; /* Lista inicialmente vacía */
leerArchTxt(&inicio);
opc=menu();
while(opc!=SALIR)
{
switch(opc)
{
case ALTA:
altas(&inicio);
break;
case BAJA:
//bajas(&inicio);
break;
case MODIF:
//modificar(inicio);
break;
case LISTAR:
listar(inicio);
break;
}
opc=menu();
}
guardarArchText(inicio);
liberarMemoria(&inicio);
return 0;
}
int menu(void)
{
int opc, vale; /* La variable 'vale' se utiliza para evitar un error al ingresar una letra en lugar de un dígito */
printf("Menu\n");
printf("1 - Alta\n");
printf("2 - Bajas\n");
printf("3 - Modificar\n");
printf("4 - Listar\n");
printf("5 - Salir\n");
do
{
printf("Opcion: ");
vale=scanf("%d", &opc);
while (fgetc(stdin) != '\n') /* Elimina el '\n' de la cola del teclado */
;
}while(vale!=1 || opc<ALTA || opc>SALIR);
return opc;
}
void altas(pNodo* pLista)
{
char aux[LNOM];
pNodo nuevo;
ingresarCadena(aux, LNOM, "Nombre (enter en blanco para terminar): ");
while (aux[0]!='\0') /* Mientras se ingrese un nombre */
{
if ((nuevo = (pNodo) malloc (sizeof(Nodo)) ) == NULL) /* Memoria para el nuevo nodo */
{
printf("Error: no hay suficiente memoria\n");
return;
}
strcpy(nuevo->nom, aux);
ingresarCadena(nuevo->te, LTEL, "TE: ");
printf("Ingresar fecha (d/m/a): ");
scanf("%d/%d/%d", &nuevo->nacim.d,&nuevo->nacim.m, &nuevo->nacim.a);
fgetc(stdin);
insertarEnOrden(pLista, nuevo); /* Agrega el nuevo nodo a la lista */
ingresarCadena(aux, LNOM, "Nombre (enter para terminar): ");
}
}
void insertarEnOrden(pNodo* pIni,pNodo nuevo)
{
pNodo actual, ant;
actual = *pIni;
if (actual == NULL || strcmp(nuevo->nom, actual->nom) < 0) /*Si la lista está vacía o el nuevo va al inicio */
{
nuevo->pSig = *pIni;
pIni = nuevo;
}
else
{
ant = actual;
actual = actual->pSig;
while (actual != NULL && strcmp(nuevo->nom, actual->nom) > 0)
{
ant = actual;
actual = actual->pSig;
}
ant-> pSig = nuevo;
nuevo->pSig = actual;
}
}
/* Recibe la cadena, su longitud y un mensaje para imprimir en pantalla */
void ingresarCadena(char cadena[], int tamano, char mensaje[])
{
char *p;
printf("%s", mensaje);
fgets(cadena, tamano, stdin);
if ( (p=strchr(cadena, '\n'))!=NULL)
if ((pf = fopen("AgendaList.txt", "rt")) != NULL)
{
fgets(aux, LNOM, pf);
while (!feof(pf))
{
if ((p = strchr(aux, '\n')) != NULL)
p = '\0'; /* Elimina el '\n' de la cadena leída*/
nuevo = (pNodo)malloc(sizeof(Nodo));
if (nuevo == NULL)
{
printf("ERROR: insuficiente memoria\n");
return;
}
strcpy(nuevo->nom, aux);
fgets(nuevo->te, LTEL, pf);
if ((p = strchr(nuevo->te, '\n')) != NULL)
p = '\0';
fscanf(pf, "%d/%d/%d", &(nuevo->nacim.d), &(nuevo->nacim.m), &(nuevo->nacim.a));
fgetc(pf);
insertarEnOrden(pIni, nuevo); /* Agrega el nuevo nodo a la lista */
fgets(aux, LNOM, pf);
}
fclose(pf);
}
else
printf("No se encuentra el archivo\n");
}
void liberarMemoria(pNodo* pInicio)
{
pNodo actual, anterior;
anterior = NULL;
actual = *pInicio;
while (actual)
{
anterior = actual;
actual = actual->pSig;
free(anterior);
}