elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Únete al Grupo Steam elhacker.NET


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Problemas con funciones de una agenda con listas enlazadas [C]
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Problemas con funciones de una agenda con listas enlazadas [C]  (Leído 3,279 veces)
Rhessus

Desconectado Desconectado

Mensajes: 11


Ver Perfil
Problemas con funciones de una agenda con listas enlazadas [C]
« en: 14 Julio 2016, 05:37 am »

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


Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. typedef struct contact {
  6. char name[20];
  7. char number[20];
  8. char mail[20];
  9. char address[20];
  10. struct contact *next;
  11. } Contact;
  12.  
  13. Contact *head = NULL;
  14. Contact *tail = NULL;
  15.  
  16. void imprimirSeparador() { printf("=================================\n"); }
  17.  
  18. void imprimirOpciones() {
  19.  
  20.    imprimirSeparador();
  21.    printf("Agenda\n");
  22.    printf("======\n");
  23.    printf("1. Agregar contacto\n");
  24.    printf("2. Mostrar contactos\n");
  25.    imprimirSeparador();    
  26. }
  27.  
  28. void nuevoContacto(){
  29. Contact *new;
  30. new = (Contact *)malloc(sizeof(Contact));
  31.  
  32. printf("Nombre: ");
  33. scanf("%s", new->name);
  34.  
  35. printf("Número: ");
  36. scanf("%s", new->number);
  37.  
  38. printf("Mail: ");
  39. scanf("%s", new->mail);
  40.  
  41. printf("Dirección: ");
  42. scanf("%s", new->address);
  43.  
  44.    nuevoContactoLista(new->name, new->number, new->mail, new->address);
  45. }
  46.  
  47. void nuevoContactoLista(char name[], char number[], char mail[], char address[]){
  48.  
  49. Contact *contactoNuevo, *aux;
  50. contactoNuevo = (Contact *)malloc(sizeof(Contact));
  51.  
  52. aux = head;
  53. if(aux != NULL){
  54. while(aux != NULL) {
  55. if((strcmp(aux->name,name))==0){
  56. printf("El nombre de contacto ingresado ya existe.\n");
  57. printf("1. Intentar con otro nombre.\n");
  58. printf("2. Volver al menú.\n");
  59. submenu1();
  60. }
  61. else{
  62. aux = aux->siguiente;
  63. }
  64. }
  65. }
  66. else{
  67. strcpy(contactoNuevo->name, name);
  68. }
  69.  
  70.        aux = head;
  71. if(aux != NULL){
  72. while(aux != NULL) {
  73. if((strcmp(aux->number,number))==0){
  74. printf("El número de teléfono ingresado ya existe.\n");
  75. printf("1. Intentar con otro número.\n");
  76. printf("2. Volver al menú.\n");
  77. submenu1();
  78. }
  79. else{
  80. aux = aux->siguiente;
  81. }
  82. }
  83. }
  84. else{
  85. strcpy(contactoNuevo->number, number);
  86. }
  87.  
  88.        strcpy(contactoNuevo->mail, mail);
  89.  
  90.        strcpy(contactoNuevo->address, address);
  91.  
  92.        contactoNuevo->next = NULL;
  93.  
  94. /***************************************/
  95.  
  96. if(head==NULL){
  97. head = contactoNuevo;
  98. printf("La información del contacto ha sido guardada exitosamente.\n");
  99. }
  100.  
  101. else{
  102. aux = head;
  103. while(aux->next != NULL) {
  104. aux = aux->next;
  105. }
  106. aux->next = contactoNuevo;
  107. printf("La información del contacto ha sido guardada exitosamente.\n");
  108. }
  109. }
  110.  
  111. void submenu1(){
  112. int opcion;
  113.  
  114.        scanf("%d", &opcion);
  115.  
  116.        switch(opcion) {
  117.  
  118.            case 1:
  119.                nuevoContacto();
  120.                break;
  121.            case 2:
  122.                int main();
  123.                break;
  124.            default:
  125.                break;
  126.        }
  127. }
  128.  
  129. void imprimirContactos(){
  130. Contact *auxiliar;
  131. auxiliar = head;
  132.  
  133. printf("Contactos:\n");
  134. if(auxiliar != NULL){
  135. while(auxiliar != NULL) {
  136. printf("%s\t%s\t%s\t%s\n", auxiliar->name, auxiliar->number, auxiliar->mail, auxiliar->address);
  137. auxiliar = auxiliar->siguiente;
  138. }
  139. }
  140. else{
  141. printf("Agenda vacía.\n");
  142. }
  143. }
  144.  
  145. int main() {
  146.  
  147.    int opcion;
  148.  
  149.    while(1) {
  150.  
  151.        imprimirOpciones();
  152.  
  153.        scanf("%d", &opcion);
  154.  
  155.        switch(opcion) {
  156.  
  157.            case 1:
  158.                nuevoContacto();
  159.                break;
  160.            case 2:
  161.                imprimirContactos();
  162.                break;
  163.            default:
  164.                break;
  165.        }
  166.    }
  167. }

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.


En línea

AlbertoBSD
Programador y
Moderador Global
***
Desconectado Desconectado

Mensajes: 3.696


🏴 Libertad!!!!!


Ver Perfil WWW
Re: Problemas con funciones de una agenda con listas enlazadas [C]
« Respuesta #1 en: 14 Julio 2016, 17:54 pm »

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;


En línea

Rhessus

Desconectado Desconectado

Mensajes: 11


Ver Perfil
Re: Problemas con funciones de una agenda con listas enlazadas [C]
« Respuesta #2 en: 15 Julio 2016, 05:02 am »

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!
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines