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

 

 


Tema destacado: Sigue las noticias más importantes de seguridad informática en el ttwitter! 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 3,601 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.640

🏴 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

Publickey: 03b8b1bf1830c8d407870001ec0e7badb7a6632255fb0051284b14f53791bd6087
Donaciones
1Coffee1jV4gB5gaXfHgSHDz9xx9QSECVW
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 12,204 Último mensaje 19 Junio 2009, 01:32 am
por matiasGuacharaca
Eliminar nodo de lista? « 1 2 »
Java
monsefoster 17 45,034 Último mensaje 10 Febrero 2010, 16:32 pm
por egyware
Borrar nodo en lista simplemente enlazada[C]
Programación C/C++
NOB2014 4 5,181 Último mensaje 28 Julio 2016, 14:22 pm
por NOB2014
Agregar nodo a lista doblemente enlazada (lenguaje C)
Programación C/C++
NOB2014 7 5,139 Último mensaje 3 Agosto 2016, 16:14 pm
por AlbertoBSD
Borrar ultimo nodo lista simplemente enlazada
Programación C/C++
robertoesimez 5 3,515 Último mensaje 23 Marzo 2017, 07:22 am
por MAFUS
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines