Test Foro de elhacker.net SMF 2.1

Programación => Programación C/C++ => Mensaje iniciado por: Beginner Web en 12 Diciembre 2018, 05:12 AM

Título: Duda sobre eliminar nodos de una lista doble
Publicado por: Beginner Web en 12 Diciembre 2018, 05:12 AM
Código (cpp) [Seleccionar]
/Definicion de la estructura lista doble
typedef struct tnodo *pnodo;
typedef struct tnodo{
int dato;
pnodo sig;
pnodo ant;
};
typedef struct tlista{
pnodo inicio;
pnodo final;
};
//Porque se libera asi la memoria
void liberar_lista(tlista &lista)
{
pnodo borrado;
while(lista.inicio!=NULL){
borrado=lista.inicio;
lista.inicio=borrado->sig;
borrado->sig=NULL;
borrado->ant=NULL;
delete(borrado);
}
}
//Y no asi??
void liberar_lista(tlista &lista)
{
pnodo borrado;
while(lista.inicio!=NULL){
borrado=lista.inicio;
lista.inicio=borrado->sig;
lista.inicio->ant=NULL;
borrado->sig=NULL;
delete(borrado);
}
}
:huh:
Título: Re: Duda sobre eliminar nodos de una lista doble
Publicado por: K-YreX 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 (cpp) [Seleccionar]

lista.inicio->ant = NULL;

Ese <ant> no existe, porque ya no estás apuntando a un nodo. :-X
Título: Re: Duda sobre eliminar nodos de una lista doble
Publicado por: Beginner Web 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
Título: Re: Duda sobre eliminar nodos de una lista doble
Publicado por: K-YreX en 12 Diciembre 2018, 21:12 PM
Con el segundo código, cuando te quede un nodo sólo:
Código (cpp) [Seleccionar]

while(lista.inicio!=NULL){ // lista.inicio apunta al ultimo nodo
borrado=lista.inicio; // borrado apunta al ultimo nodo
lista.inicio=borrado->sig; // lista.inicio apunta al siguiente al ultimo que es NULL
lista.inicio->ant=NULL; // lista.inicio->ant no existe porque lista.inicio esta apuntando a NULL, no a un nodo
borrado->sig=NULL;
delete(borrado);
}


Creo que ahora es más fácil de ver porque el segundo no funcionaría. :-X
Título: Re: Duda sobre eliminar nodos de una lista doble
Publicado por: Beginner Web en 14 Diciembre 2018, 02:18 AM
Cita de: YreX-DwX en 12 Diciembre 2018, 21:12 PM
Con el segundo código, cuando te quede un nodo sólo:
Código (cpp) [Seleccionar]

while(lista.inicio!=NULL){ // lista.inicio apunta al ultimo nodo
borrado=lista.inicio; // borrado apunta al ultimo nodo
lista.inicio=borrado->sig; // lista.inicio apunta al siguiente al ultimo que es NULL
lista.inicio->ant=NULL; // lista.inicio->ant no existe porque lista.inicio esta apuntando a NULL, no a un nodo
borrado->sig=NULL;
delete(borrado);
}


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 ;)