Duda sobre eliminar nodos de una lista doble

Iniciado por Beginner Web, 12 Diciembre 2018, 05:12 AM

0 Miembros y 1 Visitante están viendo este tema.

Beginner Web

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:
7w7

K-YreX

#1
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
Código (cpp) [Seleccionar]

cout << "Todos tenemos un defecto, un error en nuestro código" << endl;

Beginner Web

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
7w7

K-YreX

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
Código (cpp) [Seleccionar]

cout << "Todos tenemos un defecto, un error en nuestro código" << endl;

Beginner Web

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