Ayuda con esta agenda
Hice este programa pero los problemas son dos:
1.- Hay líneas de código que se salta por ejemplo cuando checo si el el contacto es el primero que se da
if(primero==NULL)
{
primero=nuevo;
ultimo=nuevo;
}
En este caso se salta la segunda línea de este if y
2.- Me pueden decir como le hago para poder borrar un contacto?
No se como hacer las asignaciones.
Este es mi programa si me pueden ayudar, se los agradesco.
#include <stdio.h>
#include <conio.h>
#include <alloc.h>
int menu(void);
void agregar_cont(void);
void borrar_cont(void);
int mostrar_lista(void);
struct _agenda
{
char nombre[30];
char telefono[15];
struct _agenda *siguiente;
};
struct _agenda *primero,*ultimo;
void main(void)
{
primero=(struct _agenda *) NULL;
ultimo=(struct _agenda *) NULL;
do
{
clrscr();
}while(menu()!=4);
}
int menu(void)
{
int opcion;
printf("nnntt Agenda Personal");
printf("nnnnn 1.- Agregar nuevo contacto");
printf("nn 2.- Borrar un contacto de la lista");
printf("nn 3.- Ver lista de contactos");
printf("nn 4.- Salir");
printf("nn Elija una opcion: ");
scanf("%d",&opcion);
switch(opcion)
{
case 1:
agregar_cont(); break;
case 2:
borrar_cont(); break;
case 3:
mostrar_lista(); break;
case 4:
break;
default:
printf("tt Opcion no valida !");
getch();
}
return(opcion);
}
void agregar_cont(void)
{
struct _agenda *nuevo_cont;
nuevo_cont=(struct _agenda *)malloc(sizeof(struct _agenda));
if(nuevo_cont!=NULL)
{
printf("nnn Dame su nombre: "); scanf("%s",nuevo_cont->nombre);
printf("nn Dame su telefono: "); scanf("%s",nuevo_cont->telefono);
nuevo_cont->siguiente=NULL;
if(primero==NULL)
{
primero=nuevo_cont;
ultimo=nuevo_cont;
}
else
{
ultimo->siguiente=nuevo_cont;
ultimo=nuevo_cont;
}
printf("nn Contacto Agregado Correctamente !");
}//if(nuevo_cont!=NULL)
else
printf(" Memoria Insuficiente !");
getch();
}
void borrar_cont(void)
{
struct _agenda *borrar;
int numero;
borrar=(struct _agenda *)malloc(sizeof(struct _agenda));
if(borrar!=NULL)
{
if(mostrar_lista())
{
printf("nn Para no eliminar ninguno ponga 0");
printf("nn Cual eliminas?: "); scanf("%d",&numero);
if(numero-1!=0)
{
}
}//if(mostrar_lista())
}
else
printf("nn Memoria Insuficiente !");
}
int mostrar_lista(void)
{
struct _agenda *mostrar;
int i;
mostrar=(struct _agenda *)malloc(sizeof(struct _agenda));
if(mostrar!=NULL)
{
clrscr();
printf("nnnttt "Agenda"");
mostrar=primero;
i=0;
do
{
printf("nn %d.- %s",i+1,mostrar->nombre);
printf("n Tel.- %sn",mostrar->telefono);
mostrar=mostrar->siguiente;
}while(mostrar->siguiente!=NULL);
return(1);
}//if(mostrar!=NULL)
else
{
printf("nn Memoria Insuficiente !");
return(0);
}
}
1.- Hay líneas de código que se salta por ejemplo cuando checo si el el contacto es el primero que se da
if(primero==NULL)
{
primero=nuevo;
ultimo=nuevo;
}
En este caso se salta la segunda línea de este if y
2.- Me pueden decir como le hago para poder borrar un contacto?
No se como hacer las asignaciones.
Este es mi programa si me pueden ayudar, se los agradesco.
#include <stdio.h>
#include <conio.h>
#include <alloc.h>
int menu(void);
void agregar_cont(void);
void borrar_cont(void);
int mostrar_lista(void);
struct _agenda
{
char nombre[30];
char telefono[15];
struct _agenda *siguiente;
};
struct _agenda *primero,*ultimo;
void main(void)
{
primero=(struct _agenda *) NULL;
ultimo=(struct _agenda *) NULL;
do
{
clrscr();
}while(menu()!=4);
}
int menu(void)
{
int opcion;
printf("nnntt Agenda Personal");
printf("nnnnn 1.- Agregar nuevo contacto");
printf("nn 2.- Borrar un contacto de la lista");
printf("nn 3.- Ver lista de contactos");
printf("nn 4.- Salir");
printf("nn Elija una opcion: ");
scanf("%d",&opcion);
switch(opcion)
{
case 1:
agregar_cont(); break;
case 2:
borrar_cont(); break;
case 3:
mostrar_lista(); break;
case 4:
break;
default:
printf("tt Opcion no valida !");
getch();
}
return(opcion);
}
void agregar_cont(void)
{
struct _agenda *nuevo_cont;
nuevo_cont=(struct _agenda *)malloc(sizeof(struct _agenda));
if(nuevo_cont!=NULL)
{
printf("nnn Dame su nombre: "); scanf("%s",nuevo_cont->nombre);
printf("nn Dame su telefono: "); scanf("%s",nuevo_cont->telefono);
nuevo_cont->siguiente=NULL;
if(primero==NULL)
{
primero=nuevo_cont;
ultimo=nuevo_cont;
}
else
{
ultimo->siguiente=nuevo_cont;
ultimo=nuevo_cont;
}
printf("nn Contacto Agregado Correctamente !");
}//if(nuevo_cont!=NULL)
else
printf(" Memoria Insuficiente !");
getch();
}
void borrar_cont(void)
{
struct _agenda *borrar;
int numero;
borrar=(struct _agenda *)malloc(sizeof(struct _agenda));
if(borrar!=NULL)
{
if(mostrar_lista())
{
printf("nn Para no eliminar ninguno ponga 0");
printf("nn Cual eliminas?: "); scanf("%d",&numero);
if(numero-1!=0)
{
}
}//if(mostrar_lista())
}
else
printf("nn Memoria Insuficiente !");
}
int mostrar_lista(void)
{
struct _agenda *mostrar;
int i;
mostrar=(struct _agenda *)malloc(sizeof(struct _agenda));
if(mostrar!=NULL)
{
clrscr();
printf("nnnttt "Agenda"");
mostrar=primero;
i=0;
do
{
printf("nn %d.- %s",i+1,mostrar->nombre);
printf("n Tel.- %sn",mostrar->telefono);
mostrar=mostrar->siguiente;
}while(mostrar->siguiente!=NULL);
return(1);
}//if(mostrar!=NULL)
else
{
printf("nn Memoria Insuficiente !");
return(0);
}
}
En primer lugar, es muy raro, jamas ocurre que se ejecute una linea si y otra no de un mismo bloque. Si entra dentro del if, debe ejecutar ambas sentencias. ¿Has probado con un debugger para ver lo que pasa realmente?
Para borrar, puesto que tienes una lista enlazada, lo mas normal seria algo como:
struct_agenda anterior = (struct_agenda *)sizeof(struct_agenda);
borrar = primero;
if (i==1) {
primero = borrar->siguiente;
free(borrar);
}
else {
for (i=1; i<=numero; i++) {
anterior = borrar;
borrar = borrar->siguiente;
}
if (borrar == ultimo) {
ultimo = anterior;
free(borrar);
}
else {
anterior->siguiente = borrar->siguiente;
free(borrar);
}
}
No he probado a compilarlo ni ver si funciona, pero basicamente es lo que se suele hacer para borrar elementos de listas enlazadas.
Para borrar, puesto que tienes una lista enlazada, lo mas normal seria algo como:
struct_agenda anterior = (struct_agenda *)sizeof(struct_agenda);
borrar = primero;
if (i==1) {
primero = borrar->siguiente;
free(borrar);
}
else {
for (i=1; i<=numero; i++) {
anterior = borrar;
borrar = borrar->siguiente;
}
if (borrar == ultimo) {
ultimo = anterior;
free(borrar);
}
else {
anterior->siguiente = borrar->siguiente;
free(borrar);
}
}
No he probado a compilarlo ni ver si funciona, pero basicamente es lo que se suele hacer para borrar elementos de listas enlazadas.
