You are on page 1of 24

Instituto Politcnico Nacional Escuela Superior de Ingeniera Mecnica y Electrnica Unidad: Culhuacan Estructura y Base de Datos

LISTAS ENLAZADAS

Badillo Mirafuentes Jonathan


Gutirrez Vega Israel

1 de Diciembre de 2010

La lista enlazada o tambin llamada lista encadenada.

Es una estructura de datos que tiene una organizacin

lineal y se caracteriza porque cada uno de sus elementos tiene que indicar donde se encuentra el siguiente elemento de la lista.

Cada elemento de la lista se guarda en un nodo que

contiene la informacin y el valor que indica en donde se encuentra el siguiente dato en la lista.

Una lista enlazada esta formado por un conjunto

de nodos ligados entre si. Se denomina nodo de lista al espacio de memoria que almacena un elemento de la lista y direccin donde se encuentra el siguiente elemento.
Valor del elemento
Direccin del siguiente elemento

La lista enlazada puede representarse en memoria

esttica utilizando un arreglo de nodos o, mas comn, con memoria dinmica utilizando nodos enlazados atreves de apuntadores. Cualquiera que sea la representacin seleccionada debe existir un apuntador principal externo a la estructura que almacene la direccin del primer elemento de la lista

La implantacin de una lista enlazada requiere

primero de un tipo de dato que represente a un nodo que a su vez, permita agrupar el valor almacenado y la direccin del siguiente elemento. Las opciones para esta representacin que ofrece el lenguaje C++, son atreves de un objeto o una estructura.

Implementacin de una lista enlazada

struct lista { struct cl datos; int clave; struct lista *sig;

};
Cuando se crea una lista debe estar vaca. Por tanto

para crearla se hace lo siguiente: struct lista *L; L = NULL;

Insercin al comienzo de una lista:


void main() { struct lista *L; struct lista *p; int i; L = NULL; /* Crea una lista vacia */ for (i = 4; i >= 1; i--) { /* Reserva memoria para un nodo */ p = (struct lista *) malloc(sizeof(struct lista)); p->clave = i; /* Introduce la informacion */ p->sig = L; /* reorganiza */ L = p; /* los enlaces */ } return 0; }

Recorrido de una lista.


Algoritmo:

p = L; suma = 0; while (p != NULL) { cout<<p->clave; suma = suma + p->clave; p = p->sig; } return 0; }

Estas listas presenta una variacin mas sustancial que

la anterior. Este tipo de listas se utilizan cuando la aplicacin sobre una lista enlazada debe recorrer la lista en ambos sentidos, algo imposible de realizar en una lista enlazada lineal y, aunque es posible hacerlo en una lista circular resulta muy ineficiente.

Diagrama de una lista doblemente

enlazada

Caractersticas generales de una lista doblemente enlazada. Se requiere mantener un apuntador general a la estructura (lista), a pesar de que lo nodos conocen a su predecesor y a su sucesor. No es necesario que la lista apunte el primer elemento de la lista, ya que siempre podr llegar a el 2. Cada nodo requiere almacenar, adems del elemento, dos direcciones: la del predecesor y la del sucesor 3. El movimiento de apuntadores puede hacerse en ambas direcciones
1.

Declaracin:

struct listaDE { int clave; struct listaDE *ant, *sig; };

Procedimiento de insercin:
1. 2. 3.

Busca Crea Enlaza

void insertarDE(struct listaDE *LDE, int elem) { struct listaDE *actual, *nuevo; /* busca */ actual = LDE->sig; LDE->clave = elem; while (actual->clave < elem) actual = actual->sig; /* crea */ nuevo = (struct listaDE *) malloc(sizeof(struct listaDE)); nuevo->clave = elem; /* enlaza */ actual->ant->sig = nuevo; nuevo->ant = actual->ant; nuevo->sig = actual; actual->ant = nuevo; }

Procedimiento de borrado:
Busca 2. Borrar Funcin:
1.

void borrarDE(struct listaDE *LDE, int elem) { struct listaDE *actual; /* busca */ actual = LDE->sig; LDE->clave = elem; while (actual->clave < elem) actual = actual->sig; /* borra */ if (actual != LDE && actual->clave == elem) { actual->sig->ant = actual->ant; actual->ant->sig = actual->sig; free(actual); } }

La lista encadenada circular es una ligera variante de la lista

enlazada; se obtiene al considerar el primer nodo de la lista como el sucesor del ultimo nodo, almacenando la direccin del primer elemento en el campo de direccin del ultimo, en lugar de almacenar la direccin nula. Al realizar esta modificacin se genera automticamente un circulo donde realmente ya no existe ni el primer ni el ultimo elemento. En las listas circulares, nunca se llega a una posicin en la que ya no sea posible desplazarse. Cuando se llegue al ltimo elemento, el desplazamiento volver a comenzar desde el primer elemento.

Diagrama de lista enlazada circular

Caractersticas generales de una lista circular


1. 2. 3. 4. 5.

Es necesario mantener un apuntador general a la estructura (lista) Aunque ya no apunte obligatoriamente el primer elemento La direccin nula ya no existe en la lista, excepto cuando la lista esta vacia Si la lista contiene un solo elemento, el campo de direccin apuntara a ese mismo nodo Como la lista es un circulo, es posible llegar a cualquier nodo de la lista a partir de cualquiera de sus nodos, lo que es imposible en una lista lineal

Declaracin:

Funcin: void inicializacin (Lista *lista) { lista->inicio = NULL; lista->fin = NULL; tamao = 0; }

Mostrar la lista

void mostrar (Lista * lista) { Elemento *actual; actual = lista->inicio; int i; for(i=0;i<lista->tamao;++i) { cout<<actual, actual->dato); actual = actual->siguiente; } }

Eliminacin al inicio de la lista

int sup_lista_circ(Lista * lista) { if (lista->tamao < 2) return -1; Elemento *sup_element; sup_elemento = lista->inicio; lista->inicio = lista->inicio->siguiente; lista->fin->siguiente = lista->inicio; free (sup_elemento->dato); free (sup_elemento); lista->tamao--; return 0; }

Destruir la lista

void destruir (Lista * lista) { while (lista->tamao > 0) { if (lista->tamao > 1) sup_lista_circ (lista); else sup_lista_circ_unica(lista); }

En este tipo de listas, cada nodo almacena la

direccin de su sucesor y de su predecesor. No existe un inicio ni un final

Caractersticas generales de una lista doblemente enlazada circular


1.

2.

3.
4.

5.

Se requiere mantener un apuntador general a la estructura (lista), a pesar de que lo nodos conocen a su predecesor y a su sucesor. Este apuntador puede guardar la direccin de cualquier nodo de la lista Cada nodo requiere almacenar, adems del elemento, dos direcciones (la del predecesor y la del sucesor) La direccin nula no existe en la lista, excepto cuando esta vacia Si la lista contiene un elemento, el campo de direccin apuntara a ese mismo nodo El movimiento de apuntadores puede hacerse en ambas direcciones

You might also like