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

 

 


Tema destacado: Introducción a la Factorización De Semiprimos (RSA)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Duda sobre eliminar nodos de una lista doble
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Duda sobre eliminar nodos de una lista doble  (Leído 1,638 veces)
Beginner Web


Desconectado Desconectado

Mensajes: 634


youtu.be/0YhflLRE-DA


Ver Perfil
Duda sobre eliminar nodos de una lista doble
« en: 12 Diciembre 2018, 05:12 am »

Código
  1. /Definicion de la estructura lista doble
  2. typedef struct tnodo *pnodo;
  3. typedef struct tnodo{
  4. int dato;
  5. pnodo sig;
  6. pnodo ant;
  7. };
  8. typedef struct tlista{
  9. pnodo inicio;
  10. pnodo final;
  11. };
  12. //Porque se libera asi la memoria
  13. void liberar_lista(tlista &lista)
  14. {
  15. pnodo borrado;
  16. while(lista.inicio!=NULL){
  17. borrado=lista.inicio;
  18. lista.inicio=borrado->sig;
  19. borrado->sig=NULL;
  20. borrado->ant=NULL;
  21. delete(borrado);
  22. }
  23. }
  24. //Y no asi??
  25. void liberar_lista(tlista &lista)
  26. {
  27. pnodo borrado;
  28. while(lista.inicio!=NULL){
  29. borrado=lista.inicio;
  30. lista.inicio=borrado->sig;
  31. lista.inicio->ant=NULL;
  32. borrado->sig=NULL;
  33. delete(borrado);
  34. }
  35. }
:huh:


En línea

7w7
K-YreX
Moderador
***
Desconectado Desconectado

Mensajes: 1.008



Ver Perfil
Re: Duda sobre eliminar nodos de una lista doble
« Respuesta #1 en: 12 Diciembre 2018, 06:09 am »

Esto es porque cada nodo al tener dos punteros, la idea es que todos apunten a NULL. Si se usa la segunda función, el <pnodo ant> del primer nodo, no quedaría apuntando a NULL, ya que este no se modifica. Del segundo nodo hasta el penúltimo también obtienes el mismo resultado pero en el primero y en el último, no.
Para el último nodo, <lista.inicio> apunta al último nodo, haces que <borrado> apunte también a él, después <lista.inicio> apunta al siguiente (que es NULL). Si haces:
Código
  1. lista.inicio->ant = NULL;
Ese <ant> no existe, porque ya no estás apuntando a un nodo. :-X


« Última modificación: 12 Diciembre 2018, 06:14 am por YreX-DwX » En línea

Código
  1. cout << "Todos tenemos un defecto, un error en nuestro código" << endl;
Beginner Web


Desconectado Desconectado

Mensajes: 634


youtu.be/0YhflLRE-DA


Ver Perfil
Re: Duda sobre eliminar nodos de una lista doble
« Respuesta #2 en: 12 Diciembre 2018, 20:39 pm »

No entendi pero creo suponer que no importa el puntero anterior de la lista.inicio y si importa que el puntero nodo a eliminar deben apuntar en ambas direcciones a NULL antes de ser eliminado  :xD
En línea

7w7
K-YreX
Moderador
***
Desconectado Desconectado

Mensajes: 1.008



Ver Perfil
Re: Duda sobre eliminar nodos de una lista doble
« Respuesta #3 en: 12 Diciembre 2018, 21:12 pm »

Con el segundo código, cuando te quede un nodo sólo:
Código
  1. while(lista.inicio!=NULL){ // lista.inicio apunta al ultimo nodo
  2. borrado=lista.inicio; // borrado apunta al ultimo nodo
  3. lista.inicio=borrado->sig; // lista.inicio apunta al siguiente al ultimo que es NULL
  4. lista.inicio->ant=NULL; // lista.inicio->ant no existe porque lista.inicio esta apuntando a NULL, no a un nodo
  5. borrado->sig=NULL;
  6. delete(borrado);
  7. }

Creo que ahora es más fácil de ver porque el segundo no funcionaría. :-X
En línea

Código
  1. cout << "Todos tenemos un defecto, un error en nuestro código" << endl;
Beginner Web


Desconectado Desconectado

Mensajes: 634


youtu.be/0YhflLRE-DA


Ver Perfil
Re: Duda sobre eliminar nodos de una lista doble
« Respuesta #4 en: 14 Diciembre 2018, 02:18 am »

Con el segundo código, cuando te quede un nodo sólo:
Código
  1. while(lista.inicio!=NULL){ // lista.inicio apunta al ultimo nodo
  2. borrado=lista.inicio; // borrado apunta al ultimo nodo
  3. lista.inicio=borrado->sig; // lista.inicio apunta al siguiente al ultimo que es NULL
  4. lista.inicio->ant=NULL; // lista.inicio->ant no existe porque lista.inicio esta apuntando a NULL, no a un nodo
  5. borrado->sig=NULL;
  6. delete(borrado);
  7. }

Creo que ahora es más fácil de ver porque el segundo no funcionaría. :-X
ahhhhhhhhhhhhhhhhhhh! eso responde muchas dudas sobre elimininacion de nodos , muchas gracias ;)
En línea

7w7
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

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