Problemas con funciones de una agenda con listas enlazadas [C]

Iniciado por Rhessus, 14 Julio 2016, 05:37 AM

0 Miembros y 1 Visitante están viendo este tema.

Rhessus

Hola a todos.
Estoy haciendo una agenda en C, pero hay un error que no puedo llegar a vislumbrar.


Código (bash) [Seleccionar]
#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.

AlbertoBSD

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;
Donaciones
1Coffee1jV4gB5gaXfHgSHDz9xx9QSECVW

Rhessus

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!