Você está na página 1de 10

TERCERA UNIDAD- ESTRUCTURAS LINEALES- LISTAS

SEP

DGEST

INSTITUTO TECNOLOGICO DE TUXTEPEC


MATERIA:

Estructura de Datos.
UNIDAD II
TEMA:

LISTAS
PRESENTA:

ROSA MARA CRISTBAL JOAQUN


AREA:
ING. INFORMATICA

2011-09

INTRODUCCIN
En la siguiente investigacin hablaremos sobre el tema de
LISTAS, as como puntos importantes de estas.
Definiremos el concepto de dicho tema, as como los tipos y,
operaciones bsicas y caractersticas de cada lista.
Trataremos sobre la aplicacin de cada una de ellas y
sobre su estructura en java.

DEFINICIN
Una lista es una estructura de datos secuencial.

Una manera de clasificarlas es por la forma de acceder al siguiente elemento:


- lista densa: la propia estructura determina cul es el siguiente elemento de la lista. Ejemplo: un
array.
- lista enlazada: la posicin del siguiente elemento de la estructura la determina el elemento actual.
Es necesario almacenar al menos la posicin de memoria del primer elemento. Adems es dinmica,
es decir, su tamao cambia durante la ejecucin del programa.
Una lista enlazada se puede definir recursivamente de la siguiente manera:
una
lista
enlazada
es
una
estructura
vaca
o
- un elemento de informacin y un enlace hacia una lista (un nodo).
Como se ha dicho anteriormente, pueden cambiar de tamao, pero su ventaja fundamental es que
son flexibles a la hora de reorganizar sus elementos; a cambio se ha de pagar una mayor lentitud a la
hora de acceder a cualquier elemento.
En la lista de la figura anterior se puede observar que hay dos elementos de informacin, x e y.
Supongamos que queremos aadir un nuevo nodo, con la informacin p, al comienzo de la lista. Para
hacerlo basta con crear ese nodo, introducir la informacin p, y hacer un enlace hacia el siguiente
nodo,
que
en
este
caso
contiene
la
informacin
x.
Qu ocurre si quisiramos hacer lo mismo sobre un array?. En ese caso sera necesario desplazar todos
los elementos de informacin "hacia la derecha", para poder introducir el nuevo elemento, una
operacin muy engorrosa.

OPERACIONES BSICAS SOBRE LISTAS


- Insercin al comienzo de una lista:
Es necesario utilizar una variable auxiliar, que se utiliza para crear el nuevo nodo
mediante la reserva de memoria y asignacin de la clave. Posteriormente es necesario
reorganizar los enlaces, es decir, el nuevo nodo debe apuntar al que era el primer
elemento de la lista y a su vez debe pasar a ser el primer elemento.
En el siguiente ejemplo se muestra un programa que crea una lista con cuatro nmeros.
Notar que al introducir al comienzo de la lista, los elementos quedan ordenados en
sentido inverso al de su llegada. Notar tambin que se ha utilizado un puntero
auxiliar p para mantener correctamente los enlaces dentro de la lista.
#include <stdlib.h>
struct lista
{
int clave;
struct lista *sig;
};
int main(void)

{
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;
}

TIPOS DE LISTAS ENLAZADAS


Listas enlazadas lineales
Listas simples enlazadas
La lista enlazada bsica es la lista enlazada simple la cual tiene un enlace por nodo. Este enlace
apunta al siguiente nodo en la lista, o al valor NULL o a la lista vaca, si es el ltimo nodo.

Una lista enlazada simple contiene dos valores: el valor actual del nodo y un enlace al
siguiente nodo
Lista Doblemente Enlazada
Un tipo de lista enlazada ms sofisticado es la lista doblemente enlazada o lista enlazadas de
dos vas. Cada nodo tiene dos enlaces: uno apunta al nodo anterior, o apunta al valor NULL si es el
primer nodo; y otro que apunta al nodo siguiente, o apunta al valor NULL si es el ltimo nodo.

Una lista doblemente enlazada contiene tres valores: el valor, el link al nodo siguiente, y
el link al anterior

En algn lenguaje de muy bajo nivel, XOR-Linking ofrece una va para implementar listas
doblemente enlazadas, usando una sola palabra para ambos enlaces, aunque el uso de esta tcnica
no se suele utilizar.

Listas enlazadas circulares


En una lista enlazada circular, el primer y el ltimo nodo estn unidos juntos. Esto se puede hacer
tanto para listas enlazadas simples como para las doblemente enlazadas. Para recorrer una lista
enlazada circular podemos empezar por cualquier nodo y seguir la lista en cualquier direccin hasta
que se regrese hasta el nodo original. Desde otro punto de vista, las listas enlazadas circulares pueden
ser vistas como listas sin comienzo ni fin. Este tipo de listas es el ms usado para dirigir buffers para
ingerir datos, y para visitar todos los nodos de una lista a partir de uno dado.

Una lista enlazada circular que contiene tres valores enteros


Listas enlazadas circulares simples
Cada nodo tiene un enlace, similar al de las listas enlazadas simples, excepto que el siguiente nodo del
ltimo apunta al primero. Como en una lista enlazada simple, los nuevos nodos pueden ser solo
eficientemente insertados despus de uno que ya tengamos referenciado. Por esta razn, es usual
quedarse con una referencia solamente al ltimo elemento en una lista enlazada circular simple, esto
nos permite rpidas inserciones al principio, y tambin permite accesos al primer nodo desde el
puntero del ltimo nodo. 1
Lista Enlazada Doblemente Circular
En una lista enlazada doblemente circular, cada nodo tiene dos enlaces, similares a los de la lista
doblemente enlazada, excepto que el enlace anterior del primer nodo apunta al ltimo y el enlace
siguiente del ltimo nodo, apunta al primero. Como en una lista doblemente enlazada, las inserciones
y eliminaciones pueden ser hechas desde cualquier punto con acceso a algn nodo cercano. Aunque
estructuralmente una lista circular doblemente enlazada no tiene ni principio ni fin, un puntero de
acceso externo puede establecer el nodo apuntado que est en la cabeza o al nodo cola, y as
mantener el orden tan bien como en una lista doblemente enlazada.

Nodos Centinelas
A veces las listas enlazadas tienen un nodo centinela (tambin llamado falso nodo o nodo ficticio) al
principio o al final de la lista, el cual no es usado para guardar datos. Su propsito es simplificar o
agilizar algunas operaciones, asegurando que cualquier nodo tiene otro anterior o posterior, y que
toda la lista (incluso alguna que no contenga datos) siempre tenga un primer y ltimo nodo.

LISTAS ENLAZADAS.

La lista enlazada es un TDA que nos permite almacenar datos de una forma
organizada, al igual que los vectores pero, a diferencia de estos, esta estructura es
dinmica, por lo que no tenemos que saber "a priori" los elementos que puede contener.
En una lista enlazada, cada elemento apunta al siguiente excepto el ltimo que no tiene
sucesor y el valor del enlace es null. Por ello los elementos son registros que contienen el
dato a almacenar y un enlace al siguiente elemento. Los elementos de una lista, suelen
recibir tambin el nombre de nodos de la lista.
struct lista {
gint dato;
lista *siguiente;
};
Representa el dato a almacenar. Puede ser de cualquier tipo; en este ejemplo se
trata de una lista de enteros.
Es un puntero al siguiente elemento de la lista; con este puntero enlazamos con el
sucesor, de forma que podamos construir la lista.

Para que esta estructura sea un TDA lista enlazada, debe tener unos operadores
asociados que permitan la manipulacin de los datos que contiene. Los operadores
bsicos de una lista enlazada son:
Insertar: inserta un nodo con dato x en la lista, pudiendo realizarse esta insercin al
principio o final de la lista o bien en orden.
Eliminar: elimina un nodo de la lista, puede ser segn la posicin o por el dato.
Buscar: busca un elemento en la lista.
Localizar: obtiene la posicin del nodo en la lista.
Vaciar: borra todos los elementos de la lista
Despus de esta breve introduccin, que slo pretende servir como recordatorio,
pasaremos a ver cmo es la estructura GSList que, junto con el conjunto de funciones que
la acompaan, forman el TDA lista enlazada en GLib.

LISTAS DOBLEMENTE ENLAZADAS


Son listas que tienen un enlace con el elemento siguiente y con el anterior. Una ventaja que tienen es
que pueden recorrerse en ambos sentidos, ya sea para efectuar una operacin con cada elemento o
para insertar/actualizar y borrar. La otra ventaja es que las bsquedas son algo ms rpidas puesto
que no hace falta hacer referencia al elemento anterior. Su inconveniente es que ocupan ms
memoria por nodo que una lista simple.
Se realizar una implementacin de lista ordenada con doble enlace que aproveche el uso de la
cabecera y el centinela. A continuacin se muestra un grfico que muestra una lista doblemente
enlazada con cabecera y centinela, para lo que se utiliza un nico nodo que haga las veces de
cabecera y centinela.

- Declaracin:

struct listaDE
{
int clave;
struct listaDE *ant,
*sig;
};
- Procedimiento de creacin:

void crearDE(struct listaDE **LDE)


{
*LDE = (struct listaDE *) malloc(sizeof(struct listaDE));
(*LDE)->sig = (*LDE)->ant = *LDE;
}
- Procedimiento de insercin:

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:

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);
}
}
Para probarlo se pueden usar las siguientes instrucciones:

struct listaDE *LDE;


...
crearDE(&LDE);
insertarDE(LDE, 1);
borrarDE(LDE, 1)

LISTAS CIRCULARES

Las listas circulares tienen la caracterstica de que el ltimo elemento de la misma


apunta al primero
La siguiente figura es una representacin grfica de una lista circular.
Enseguida se mostrarn los algoritmos ms comunes en listas circulares. Al igual que en
las secciones anteriores, utilizaremos el apuntador top para hacer referencia al primer
nodo en la lista.
Algoritmo de creacin
repite
new(p)
lee(p(dato))
si top=nil entonces
top<--p
q<--p
en caso contrario

q(liga)<--p
q<--p
p(liga)<--top
mensaje (otro nodo ?)
lee(respuesta)
hasta respuesta=no
Algoritmo para recorrer la lista
p<--top
repite
escribe(p(dato))
p<--p(liga)
hasta p=top
Algoritmo para insertar antes de 'X' informacin
new(p)
lee(p(dato))
si top=nil entonces
top<--p
p(liga)<--top
en caso contrario
mensaje(antes de ?)
lee(x)
q<--top
r<--top(liga)
repite
si q(dato)=x entonces
p(liga)<--q
r(liga)<--p
si p(liga)=top entonces
top<--p
q<--q(liga)
r<--r(liga)
hasta q=top

Algoritmo para insertar despus de 'X' informacin


new(p)
lee(p(dato))
mensaje(despus de ?)

lee(x)
q<--top
r<--top(liga)
repite
si q(dato)=x entonces
q(liga)<--p
p(liga)<--r
q<--q(liga)
r<--r(liga)
hasta q=top
Algoritmo para borrar
mensaje(valor a borrar )
lee(valor_a_borrar)
q<--top
r<--top
p<--top
mientras q(liga)<>top haz
q<--q(liga)
repite
si p(dato)=valor_a_borrar entonces
si p=top entonces
si top(liga)=top entonces
top<--NIL
en caso contrario
top<--top(liga)
q(liga)<--top
en caso contrario
r(liga)<--p(liga)
dispose(p)
p<--top
en caso contrario
r<--p
p<--p(liga)
hasta p=top

APLICACIONES DE LAS LISTAS ENLAZADAS


Las listas enlazadas son usadas como mdulos para otras muchas estructuras de datos, tales
como pilas, colas y sus variaciones.

El campo de datos de un nodo puede ser otra lista enlazada. Mediante este mecanismo, podemos
construir muchas estructuras de datos enlazadas con listas; esta prctica tiene su origen en el lenguaje
de programacin Lisp, donde las listas enlazadas son una estructura de datos primaria (aunque no la
nica), y ahora es una caracterstica comn en el estilo de programacin funcional.
A veces, las listas enlazadas son usadas para implementar arrays asociativos, y estas en el contexto de
las llamadas listas asociativas. Hay pocas ventajas en este uso de las listas enlazadas; hay mejores
formas de implementar stas estructuras, por ejemplo con rboles binarios de bsqueda equilibrados.
Sin embargo, a veces una lista enlazada es dinmicamente creada fuera de un subconjunto propio de
nodos semejante a un rbol, y son usadas ms eficientemente para recorrer sta serie de datos

CONCLUSIN
Las listas enlazadas son muy verstiles. Adems, pueden definirse estructuras ms complejas a partir
de las listas, como por ejemplo arrays de listas, etc. En algunas ocasiones los grafos se definen como
listas de adyacencia (ver seccin de grafos). Tambin se utilizan para las tablas de hash (dispersin)
como arrays de listas.

Son eficaces igualmente para disear colas de prioridad, pilas y colas sin prioridad, y en general
cualquier estructura cuyo acceso a sus elementos se realice de manera secuencial.

Você também pode gostar