Hola a todos.
Estoy haciendo una agenda en C, pero hay un error que no puedo llegar a vislumbrar.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct contact {
char name[20];
char number[20];
char mail[20];
char address[20];
struct contact *next;
} Contact;
Contact *head = NULL;
Contact *tail = NULL;
void imprimirSeparador() { printf("=================================\n"); }
void imprimirOpciones() {
imprimirSeparador();
printf("Agenda\n");
printf("======\n");
printf("1. Agregar contacto\n");
printf("2. Mostrar contactos\n");
imprimirSeparador();
}
void nuevoContacto(){
Contact *new;
new = (Contact *)malloc(sizeof(Contact));
printf("Nombre: ");
scanf("%s", new->name);
printf("Número: ");
scanf("%s", new->number);
printf("Mail: ");
scanf("%s", new->mail);
printf("Dirección: ");
scanf("%s", new->address);
nuevoContactoLista(new->name, new->number, new->mail, new->address);
}
void nuevoContactoLista(char name[], char number[], char mail[], char address[]){
Contact *contactoNuevo, *aux;
contactoNuevo = (Contact *)malloc(sizeof(Contact));
aux = head;
if(aux != NULL){
while(aux != NULL) {
if((strcmp(aux->name,name))==0){
printf("El nombre de contacto ingresado ya existe.\n");
printf("1. Intentar con otro nombre.\n");
printf("2. Volver al menú.\n");
submenu1();
}
else{
aux = aux->siguiente;
}
}
}
else{
strcpy(contactoNuevo->name, name);
}
aux = head;
if(aux != NULL){
while(aux != NULL) {
if((strcmp(aux->number,number))==0){
printf("El número de teléfono ingresado ya existe.\n");
printf("1. Intentar con otro número.\n");
printf("2. Volver al menú.\n");
submenu1();
}
else{
aux = aux->siguiente;
}
}
}
else{
strcpy(contactoNuevo->number, number);
}
strcpy(contactoNuevo->mail, mail);
strcpy(contactoNuevo->address, address);
contactoNuevo->next = NULL;
/***************************************/
if(head==NULL){
head = contactoNuevo;
printf("La información del contacto ha sido guardada exitosamente.\n");
}
else{
aux = head;
while(aux->next != NULL) {
aux = aux->next;
}
aux->next = contactoNuevo;
printf("La información del contacto ha sido guardada exitosamente.\n");
}
}
void submenu1(){
int opcion;
scanf("%d", &opcion);
switch(opcion) {
case 1:
nuevoContacto();
break;
case 2:
int main();
break;
default:
break;
}
}
void imprimirContactos(){
Contact *auxiliar;
auxiliar = head;
printf("Contactos:\n");
if(auxiliar != NULL){
while(auxiliar != NULL) {
printf("%s\t%s\t%s\t%s\n", auxiliar->name, auxiliar->number, auxiliar->mail, auxiliar->address);
auxiliar = auxiliar->siguiente;
}
}
else{
printf("Agenda vacía.\n");
}
}
int main() {
int opcion;
while(1) {
imprimirOpciones();
scanf("%d", &opcion);
switch(opcion) {
case 1:
nuevoContacto();
break;
case 2:
imprimirContactos();
break;
default:
break;
}
}
}
Hay dos cosas particulares en el ejercicio: no pueden haber dos contactos que tengan el mismo nombre o número de teléfono, y es necesario que la información almacenada en nuevoContacto() pase a nuevoContactoLista().
Mi problema: no entiendo por qué no identifica la repetición cuando ingreso dos nombres de contacto iguales, además de no realizar ninguna acción al seleccionar la segunda opción.
Muchas gracias por su tiempo y esfuerzo.
Hola veo que vas bien. Sobre tu duda si quieres depura un poco el codigo en la comparacion.
Imprime el strlen y contanido de cada cadena antes de la comparacion, para ver si hay alguna diferencia.
Algunos detalles:
contactoNuevo
Si ya existe el nombre o telefono esta posicion de memoria que se asigno al principio del codigo no se libera y por lo tanto estas desperdiciando memoria
Si ya se inicializo con calloc no es necesario agregar = NULL ya que actualmente ya vala 0 por lo tanto esta instruccion es inecesaria
contactoNuevo->next = NULL;
Muchas gracias, AlbertoBSD.
Parece que tuve un problema a la hora de compilar, y siempre ejecutaba el mismo código. Ya pude corregir los errores, teniendo en cuenta lo que dijiste.
De nuevo, gracias!