Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Rhessus en 19 Julio 2016, 21:30 pm



Título: Eliminar nodo en lista enlazada: problema con el último nodo [C]
Publicado por: Rhessus en 19 Julio 2016, 21:30 pm
Hola a todos.
A punto de terminar la bendita agenda de contactos, me encuentro con el problema que espero sea el último de esta magnitud: mi programa devuelve un error (violación de segmento) después de eliminar el último nodo.
Les comparto el código pertinente:

Código
  1.  
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5.  
  6. #define N 30 //cantidad de caracteres para las cadenas
  7.  
  8. typedef struct contact {
  9.  
  10. char name[N];
  11. char number[N];
  12. char mail[N];
  13. char address[N];
  14. struct contact *next;
  15.  
  16. } Contact;
  17.  
  18. /***************************************************************************************************************************/
  19.  
  20. Contact *head = NULL;
  21. Contact *tail = NULL;
  22.  
  23. /***************************************************************************************************************************/
  24.  
  25. void eliminarContactoNombre(){
  26.  
  27.        Contact *aux = head;
  28. int i = 0;
  29. char nom[N];
  30. int opcion;
  31.  
  32. imprimirSeparador(); //imprime una linea y un enter para ordenar el texto
  33.  
  34. printf("Ingrese el nombre del contacto que desea eliminar: ");
  35. scanf("%s", nom);
  36.  
  37. printf("\n");
  38. imprimirSeparador(); //imprime una linea y un enter para ordenar el texto
  39.  
  40. while(aux != NULL){
  41. if(strcmp(aux->name, nom) == 0){ //si el nombre del contacto coincide con el nombre ingresado
  42. i++; //el contador suma uno
  43. printf("¿Está seguro de querer eliminar a '%s' de la agenda?\n", nom);
  44. printf("1. Sí\n");
  45. printf("2. No\n");
  46.  
  47. imprimirSeparador(); //imprime una linea y un enter para ordenar el texto
  48.  
  49. scanf("%d", &opcion);
  50.  
  51. switch(opcion) {
  52.  
  53. case 1:
  54. eliminarContactoNombreLista(nom); //funcion que borra el contacto y ordena la lista para que el anterior apunte al siguiente del nodo eliminado
  55. break;
  56. case 2:
  57. main();
  58. break;
  59. default:
  60. break;
  61. }
  62.  
  63. if(opcion == 1){
  64. imprimirSeparador(); //imprime una linea y un enter para ordenar el texto
  65. printf("El contacto '%s' ha sido borrado de la agenda\n", nom);
  66. }
  67. break;
  68. }
  69.  
  70. else{      //en caso de que el nombre del contacto no coincida con el ingresado
  71. aux = aux->next;   //pasa al siguiente contacto
  72. }
  73. }
  74.  
  75. if(i == 0){ //si no se encontro´ ningun contacto con el nombre ingresado, el contador es igual a 0
  76. printf("No existe ningún contacto con el nombre '%s'\n", nom);
  77. }
  78.  
  79. }
  80.  
  81. /***************************************************************************************************************************/
  82.  
  83. void eliminarContactoNombreLista(char nom[]){
  84.  
  85. Contact *aux_borrar;
  86. Contact *anterior = NULL;
  87.  
  88. aux_borrar = head;
  89.  
  90. while(aux_borrar != NULL && strcmp(aux_borrar->name, nom) != 0){ //
  91. anterior = aux_borrar;
  92. aux_borrar = aux_borrar->next;
  93. }
  94. if(anterior == NULL){
  95. head = head->next;
  96. free(aux_borrar);
  97. }
  98. else{
  99. anterior->next = aux_borrar->next;
  100. free(aux_borrar);
  101. }
  102. }

Espero puedan ayudarme. Muchas gracias.
Saludos. Nahuel.


Título: Re: Eliminar nodo en lista enlazada: problema con el último nodo [C]
Publicado por: AlbertoBSD en 19 Julio 2016, 21:46 pm
La funcion eliminar que tienes esta muy simple faltan muchas comprobaciones.

por ejemplo liberas aux_borrar sin comprobar si es NULL.

Ademas si es el ultimo ten en cuenta que ya no hay next

Código
  1. aux_borrar->next;

Es valor es NULL y si realizas operaciones con el head y este es null claramente sera una violacion de segmento.

En mi canal tengo un video donde me toma un buen de tiempo eliminar un nodo.

FqKsZzM0uEU

Saludos


Título: Re: Eliminar nodo en lista enlazada: problema con el último nodo [C]
Publicado por: Rhessus en 20 Julio 2016, 06:08 am
Excelente video, Alberto. Con tu ejemplo pude darme cuenta lo que me faltaba.
Muchísimas gracias!