Está en la página 1de 5

20/03/2013

Listas Doblemente Encadenadas


L

Definicin del nodo.


struct nodo { int elemento; // puede ser otro tipo struct nodo *siguiente,*anterior; };

87

99

15

En algunas aplicaciones se puede desear recorrer la lista hacia adelante y hacia atrs, o dado un elemento, conocer rpidamente los elementos anterior y siguiente. En esas situaciones se le da a cada nodo sobre una lista un puntero a los nodos siguiente y anterior en la lista tal y como se muestra en la figura.

Borrar un nodo
void borrar (p) { if (p->anterior != NULL) p->anterior->siguiente = p->siguiente; if (p->siguiente != NULL)p->siguiente->anterior = p->anterior; free(p); }

Listas Doblemente encadenadas Circulares.


Para obviar los problemas derivados de los elementos primero y ltimo, es comn hacer que la cabecera de la lista doblemente enlazada sea una celda que efectivamente complete p el crculo, , es decir, , el anterior a la celda de cabecera sea la ltima celda de la lista y la siguiente la primera. De esta manera no se necesita chequear para NULL en el anterior procedimiento borrar.

Listas doblemente Encadenadas circulares.

Listas Doblemente encadenadas Circulares.


Se puede realizar una implementacin de listas doblemente enlazadas con cabecera tal que tenga una estructura circular en el sentido de que dado un nodo y por medio de los punteros siguiente podemos volver hasta l como omo se ep puede ede ob observar e en l la fig figura (de fo forma m anloga nlog para anterior).

20/03/2013

Ejemplo:
L

Representaciones contiguas
0 1 Campo elementos 1 n-1 a1 a2 Lista ... an ...

Vaco

Escriba funciones C que permitan: 1. Buscar un elemento en la LDE 2. Insertar un nuevo elemento 3. Borrar un elemento existente

max-1 Campo longitud

-Longitud de la lista

Representaciones Estticas

Creacin de la lista
Lista Siempre es conveniente almacenar el total de elementos de la lista en una variable, y verificar que ste no exceda el mximo de almacenamiento de la lista.

0 1

a1 a2 ...

#define LMAX = 100; /* constante */ typedef struct { int elementos[LMAX]; int n; } Lista;
: :

n-1

an ... Vaco

max-1

--

a 0

b 1

c 2

d 3

e 4

Lista L1; int i=0; for (i=0; i<L1->n; i++){ printf(Ingrese el valor del nodo %d, i); scanf(&L1->elementos[i]); }

Operaciones sobre Listas Lineales: Buscar dato


a 0 1 b 2 c 3 d 4 e

Operaciones sobre Listas Lineales: eliminacin.


Eliminacin de un elemento por su posicin: Sea L = (a, b, c, d, e), eliminar a c de la lista genera: L = (a, b, d, e) Los ndices de d y e se decrementan en 1
4 5 6

Buscar el valor X obliga a recorrer la lista verificando si existe o no el elemento.

int buscar(int L[], int X, int N) { int i=0; int boo=0; do { if (L[i]!=X) i++; else { boo=1; i=N;} } while (i<N); return(boo); }

a 0

b 1 2

d 3

Ejercicio: escriba una funcin que permita eliminar al elemento ubicado en la posicin j de la lista.

20/03/2013

Insertar un dato

Insertar un dato

Insertar X en la posicin ltima:

Insertar X en una posicin intermedia: 1.- Verificar si existe espacio disponible.

1.- Verificar si existe espacio i disponible. di ibl


a 0 b 1 d 2 e 3 X 4 5 6

x 0

a 1

b 2

c 3

d 4

e 5 6

2.- Si existe espacio, se ingresa x en la posicin final.

2.- Si existe espacio, 2 espacio se desplazar los valores (desde la posicin de insercin) hacia a la derecha.

Ejercicio: escriba una funcin que permita la insercin cuando sea posible- de un elemento X en la lista.

COMPARACIN DE MTODOS
es mejor usar implementacin de listas enlazadas o de almacenamiento esttico?

Puntos principales a considerar:


La implementacin esttica obliga a especificar el tamao mximo de una lista en tiempo de compilacin. Si no se puede limitar la longitud de la lista, se debera escoger la implementacin basada en punteros. Este problema ha sido parcialmente solucionado con la parametrizacin del tamao mximo de la lista, pero an as hay que delimitar el tamao mximo para cada una de las listas.

Depende del contexto. Depende de las operaciones que se desea llevar a cabo y de su frecuencia. Tambin influye la longitud de la lista.

Ciertas operaciones requieren ms tiempo en unas implementaciones que en otras. Por ej. insertar y borrar aplican un nmero constante de pasos en una lista enlazada, pero necesitan tiempo proporcional al total de nodos en representacin esttica.

La implementacin esttica puede desperdiciar espacio, ya que usa la cantidad mxima de espacio independientemente del nmero de elementos presentes en la lista en un momento dado. La implementacin por punteros usa tanto espacio como necesita para los elementos que hay en la lista, pero necesita espacio adicional para los punteros de cada celda.

20/03/2013

Listas Circulares

Lista enlazada circular


En una lista enlazada circular, el primer y el ltimo nodo estn unidos. Al recorrer una lista enlazada circular se puede comenzar por cualquier nodo y seguir la lista hasta que se regrese hasta el nodo original. Este tipo de listas es el ms usado para visitar todos los nodos de una lista a partir de uno dado.

87

99

15

Listas circulares: implementacin esttica

Listas circulares, implementacin esttica


Recorrido circular: desde la posicin 0 hasta la N-1, desde la N-1 continua con la posicin 0. Cuando est llena la capacidad del vector, si tiene menos de N elementos, entonces.

2 .

N-1 N1 N-1 0 1 2 3 : :

El recorrido es desde la posicin 0 hasta la posicin i, desde la posicin i contina con la posicin 0.

Listas circulares, implementacin esttica

Listas circulares, implementacin esttica

Overflow: hay ms elementos que capacidad de almacenamiento.


X ???

Eliminacin: obliga a desplazar hacia a la izquierda a


todos los elementos del array.

i+1

20/03/2013

Listas circulares, implementacin esttica

Ejercicio:

Insercin: obliga a desplazar hacia la derecha a los elementos del array.

Escriba las funciones necesarias para la creacin, insercin y eliminacin de datos en una lista circular esttica que contiene slo valores enteros.

i+1