listas doblemente enlazadas

Download Listas doblemente enlazadas

Post on 16-Apr-2017

143 views

Category:

Software

0 download

Embed Size (px)

TRANSCRIPT

LISTAS DOBLEMENTE ENLAZADAS

LISTAS DOBLEMENTE ENLAZADASGRUPO 3WILSON CHIACAIZAJAIRO LEMARENE LASSOEDISON JACOME

LISTAS DOBLEMENTE ENLAZADAEn las listas doblemente enlazadas, cada elemento contiene dos punteros aparte del valor almacenado en el elemento. Un puntero apunta al siguiente elemento de la lista y el otro puntero apunta al elemento anterior. La figura 18.6. muestra una lista doblemente enlazada y un nodo de dicha lista.

Las operaciones sobre una lista doblemente enlazada son:

Crear listaInsertar nodo al inicio y al FinalEliminar nodo al inicioBuscar o Recorrer

Existe una operacin de insertar y eliminar (borrar) en cada direccin. La figura 18.7. muestra el problema de insertar un nodo p a la derecha del nodo actual. Deben asignarse cuatro nuevos enlaces,

En el caso de eliminar (borrar) un nodo de una lista doblemente enlazada es preciso cambiar dos punteros.

Declaracin de una lista doblemente enlazadaUna lista doblemente enlazada con valores de tipo int necesita dos punteros y el valor del campo datos. En una estructura se agrupan estos datos del modo siguiente:

typedef int Item;struct unnodo { Int dato; struct unnodo *adelante; struct unnodo *atras; }; typedef struct unnodo Nodo;

Insertar un elemento en una lista doblemente enlazadaEl algoritmo empleado para aadir o insertar un elemento en una lista doble vara dependiendo de la posicin en que se desea insertar el elemento. La posicin de insercin puede ser:

En la cabeza (elemento primero) de la lista.En el final de la lista (elemento ltimo).Antes de un elemento especificado.Despus de un elemento especificado.

Insertar un nuevo elemento en la cabeza de una lista dobleEl proceso de insercin se puede resumir en este algoritmo:

Asignar un nuevo nodo apuntado por nuevo que es una variable puntero que apunta al nuevo nodo que se va a insertar en la lista doble.Situar el nuevo elemento en el campo dato del nuevo nodo.Hacer que el campo enlace adelante del nuevo nodo apunte a la cabeza (primer nodo) de la lista original, y que el campo enlace atras del nodo cabeza apunte al nuevo nodo.Hacer que cabeza (puntero cabeza) apunte al nuevo nodo que se ha creado.

CODIGO C

En este momento, la funcin de insertar un elemento en la lista termina su ejecucin, la variable local nuevo desaparece y slo permanece el puntero de cabeza cabeza que apunta a la nueva lista doblemente enlazada.

Eliminacin de un elemento en una lista doblemente enlazadaLa operacin de eliminar un nodo de una lista doble supone realizar el enlace de dos nodos, el nodo anterior con el nodo siguiente al que se desea eliminar, con el puntero adelante, y el nodo siguiente con el anterior, con el puntero atras, y liberar la memoria que ocupa. El algoritmo para eliminar un nodo que contiene un dato es similar al algoritmo de borrado para una lista simple. Ahora la direccin del nodo anterior se encuentra en el puntero atras del nodo a borrar. Los pasos a seguir:

Bsqueda del nodo que contiene el dato. Se ha de tener la direccin del nodo a eliminar y la direccin del anterior.

El puntero adelante del nodo anterior tiene que apuntar al puntero adelante del nodo a eliminar, esto en el caso de no ser el nodo cabecera.

El puntero atrs del nodo siguiente a borrar tiene que apuntar al puntero atrs del nodo a eliminar, esto en el caso de no ser el nodo ltimo.

En caso de que el nodo a eliminar sea el primero, cabeza , se modifica cabeza para que tenga la direccin del nodo siguiente .

Por ltimo, se libera la memoria ocupada por el nodo.

Eliminar un elemento3

9

12

NULL

3

9

12

NULL

3

12

9

NULLSe busca el nodo a borrarMovemos los punterosLiberamos memoria conFree() o delete

NULLNULLNULL

13

La codificacin se presenta en la siguiente funcin:

BUSCAR O RECORRERPara recorrer una lista procederemos de un modo parecido al que usbamos con las listas abiertas, ahora no necesitamos un puntero auxiliar, pero tenemos que tener en cuenta que Lista no tiene por qu estar en uno de los extremos:Retrocedemos hasta el comienzo de la lista, asignamos a lista el valor de lista->anterior mientras lista->anterior no sea NULL.Abriremos un bucle que al menos debe tener una condicin, que el ndice no sea NULL.Dentro del bucle asignaremos a lista el valor del nodo siguiente al actual.Por ejemplo, para mostrar todos los valores de los nodos de una lista, podemos usar el siguiente bucle en C:

Movimiento/bsqueda a travs de la lista3

9

10

proximo11

12

NULLindice->ant->ant

indice->ant

indice

indice->proximo

indice

NULL

16

Cdigo Ctypedef struct _nodo { int dato; struct _nodo *siguiente; struct _nodo *anterior; } tipoNodo; typedef tipoNodo *pNodo; typedef tipoNodo *Lista; pNodo = indice; indice = Lista; while(indice->anterior) indice = indice->anterior; while(indice) { printf("%d\n", indice->dato); indice = indice->siguiente; }

GRACIAS POR SU ATENCION