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

 

 


Tema destacado: Entrar al Canal Oficial Telegram de elhacker.net


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Eliminar nodo en lista enlazada: problema con el último nodo [C]
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Eliminar nodo en lista enlazada: problema con el último nodo [C]  (Leído 5,310 veces)
Rhessus

Desconectado Desconectado

Mensajes: 11


Ver Perfil
Eliminar nodo en lista enlazada: problema con el último nodo [C]
« 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.


En línea

AlbertoBSD
Programador y
Moderador Global
***
Desconectado Desconectado

Mensajes: 3.696


🏴 Libertad!!!!!


Ver Perfil WWW
Re: Eliminar nodo en lista enlazada: problema con el último nodo [C]
« Respuesta #1 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.



Saludos


En línea

Rhessus

Desconectado Desconectado

Mensajes: 11


Ver Perfil
Re: Eliminar nodo en lista enlazada: problema con el último nodo [C]
« Respuesta #2 en: 20 Julio 2016, 06:08 am »

Excelente video, Alberto. Con tu ejemplo pude darme cuenta lo que me faltaba.
Muchísimas gracias!
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
[SOLUCIONADO] como saber cuando un nodo de un treeview es nodo hoja
.NET (C#, VB.NET, ASP)
matiasGuacharaca 5 13,909 Último mensaje 19 Junio 2009, 01:32 am
por matiasGuacharaca
Eliminar nodo de lista? « 1 2 »
Java
monsefoster 17 47,328 Último mensaje 10 Febrero 2010, 16:32 pm
por egyware
Borrar nodo en lista simplemente enlazada[C]
Programación C/C++
NOB2014 4 6,042 Último mensaje 28 Julio 2016, 14:22 pm
por NOB2014
Agregar nodo a lista doblemente enlazada (lenguaje C)
Programación C/C++
NOB2014 7 6,129 Último mensaje 3 Agosto 2016, 16:14 pm
por AlbertoBSD
Borrar ultimo nodo lista simplemente enlazada
Programación C/C++
robertoesimez 5 5,295 Último mensaje 23 Marzo 2017, 07:22 am
por MAFUS
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines