ABM con listas enlazadas

Cerrado
delfi1234
Message postés
3
Date d'inscription
jueves, 9 de julio de 2020
Estatus
Miembro
Última intervención
sábado, 22 de agosto de 2020
- 9 jul 2020 a las 08:14
Hola, no sabria como hacer las funciones de baja y modificar en mi abm.
Dejo el codigo del programa por si alguien me puede ayudar. Gracias

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define LNOM 32
#define LTEL 16
#define ALTA 1
#define BAJA 2
#define MODIF 3
#define LISTAR 4
#define SALIR 5


typedef struct f
{
int d, m, a;
}fecha;

typedef struct persona Nodo,*pNodo;
struct persona
{
char nom[LNOM];
char te[LTEL];
fecha nacim;
pNodo pSig;
};

void altas (pNodo*);
void insertarEnOrden(pNodo*,pNodo);
void bajas(pNodo*);
void modificar(pNodo);
void listar(pNodo);


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)
  • p='\0';

else
while (fgetc(stdin) != '\n')
;
}

void listar(struct persona *pLista)
{
printf("\nListado:\n");
printf("%-*s %-*s %s\n", LNOM, "Nombre", LTEL, "Telefono","NACIMIENTO");
printf("%-*s %-*s ----------\n", LNOM, "------", LTEL, "--------");
while (pLista != NULL)
{
printf("%-*s %-*s %d/%d/%d\n", LNOM, pLista->nom, LTEL, pLista->te, pLista->nacim.d, pLista->nacim.m, pLista->nacim.a);
pLista = pLista->pSig;
}
printf("\n");
}

void guardarArchText(pNodo pInicio)
{
FILE * pf;
if((pf=fopen("AgendaList.txt","wt"))!=NULL)
{
while(pInicio != NULL)
{
fprintf(pf,"%s\n", pInicio->nom);
fprintf(pf,"%s\n", pInicio->te);
fprintf(pf,"%d/%d/%d\n", pInicio->nacim.d, pInicio->nacim.m, pInicio->nacim.a);
pInicio = pInicio->pSig;
}
fclose(pf);
}
else
printf("Error: no se grabó el archivo\n");
}

void leerArchTxt(pNodo * pIni )
{
FILE * pf;
pNodo nuevo;
char aux[LNOM];
char * p;

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);
}
  • pInicio = NULL;

}