Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Sesion 4 Listas Doblemente Enlazadas
Sesion 4 Listas Doblemente Enlazadas
Sesion 4
Introducción
• El TDA lista doblemente enlazada, al igual que la lista enlazada, es
un TDA dinámico lineal pero, a diferencia de este, cada nodo de la
lista doblemente enlazada contiene dos punteros, de forma que
uno apunta al siguiente nodo y el otro al predecesor. Esta
característica, permite que se pueda recorrer la lista en ambos
sentidos, cosa que no es posible en las listas simples.
• El puntero anterior del primer elemento debe apuntar hacia NULL
(el inicio de la lista).
El puntero siguiente del último elemento debe apuntar hacia NULL
(el fin de la lista).
Para acceder a un elemento, la lista puede ser recorrida en ambos
sentidos: comenzando por el inicio, el puntero siguiente permite el
desplazamiento hacia el próximo elemento.
• comenzando por el final, el puntero anterior permite el
desplazamiento hacia el elemento anterior.
Cualquiera que sea la posición en la lista, los punteros inicio y fin apuntan siempre al primer y último
elemento.
El campo tamaño contendrá el numero de elementos de la lista cualquiera que sea la operación efectuada
sobre la lista.
Operaciones sobre Listas Doblemente Enlazadas
1. Insertar nodos
1. Inicio de la lista
2. Final de lal lista
3. En posición Intermedia
2. Mostrar nodos
1. Mostrar ida
2. Mostrar de vuelta
3. Elimininar nodos
1. Eliminar primer nodo
2. Eliminar ultimo nodo
3. Eliminar nodo de una posición especifica
Inserción de un Nuevo Nodo
Para añadir un elemento a la lista hay varias
situaciones:
1 a. Inserción en una lista vacía
1.b. Inserción al inicio de la lista
1.c. Inserción al final de la lista
1.d. Inserción en una posición especifica.
Operaciones sobre Listas Doblemente Enlazadas
Inserción de un elemento en la lista
Funcion de Inicializacion:
Esta operación debe ser hecha antes de cualquier otra operación sobre la lista.
Esta inicializa el puntero inicio y el puntero fin con el puntero NULL, y el tamaño con el
valor 0.
La función
tiponodo *nuevo,*q;
nuevo
nuevo=new (tiponodo); valor
nuevo->nro=valor;
nuevo->ant=NULL;
nuevo->sgte=NULL;
if(lista==NULL) NULL NULL
lista = nuevo;
else{ lista
lista->ant=nuevo;
nuevo->sgte=lista;
lista=nuevo; lista
NULL ant valor sgte
}
}
1.b. Inserción al final
NULL nro NULL
if(lista==NULL){ lista t
lista=q;
}
} lista t
t->sgte = q q->ante = t
1.c. Insertar en una posicion
NULL nro NULL
}
2.a. Mostrar lista en sentido de ida
void mostrarida(Tnodo lista){
Tnodo actual;
actual = lista;
while(actual!=NULL){
cout<<actual->nro<<"-->";
actual=actual->sgte;
}
cout<<"NULL";
NULL NULL
} lista actual
2.b. Mostrar lista en sentido de vuelta
void mostrarvuelta(Tnodo lista){
Tnodo actual;
actual = lista;
while(actual!=NULL)
actual=actual->sgte;
while(actual->ant!=NULL){
cout<<actual->nro<<"<--";
actual=actual->ant;
}
}
NULL NULL
lista actual
3. Eliminación de un elemento de la lista
A continuación el algoritmo para eliminar un elemento de la lista: uso de un puntero
temporal para guardar la dirección de los elementos a eliminar
el elemento a eliminar puede encontrase en cualquier posición en la lista.
En relación a la lista enlazada simple en el que la eliminación solo puede ser hecha
después que un elemento ha sido designado, las listas doblemente enlazadas son más
flexibles gracias a los 2 punteros que permiten guardar el rastro tanto hacia atrás
como hacia delante. Liberar la memoria ocupada por el elemento eliminado y
actualizar el tamaño de la lista
1. Eliminamos el nodo.
lista
t = lista
t->sgte->ant = NULL;
lista = t->sgte;
delete(t); NULL
NULL
t lista
Eliminar el ultimo nodo
NULL NULL
lista t
NULL NULL
lista
t
t = lista
while(t->sgte!=NULL){
t = t->sgte;
}
t->ant->sgte = NULL;
delete(t);
Eliminar un nodo de una posicion intermedia
NULL
NULL
lista t
NULL
NULL
lista
t = lista
t while( i != pos || t->sgte != NULL){
t = t->sgte;
}
t->ant->sgte = t->sgte;
t->sgte->ant = t->ant;
delete(t);
3.d. Destrucción de la lista
Para destruir la lista entera, he utilizado la eliminación al inicio de la lista ya que el
tamaño es mayor a cero.
La función
/* destruir la lista */
void destruir (Lista &lista){
Tlista t;
while (lista->sgte != NULL) {
t=lista
lista= lista->sgte;
delete(t);
}
delete(t);
lista=NULL;