Escolar Documentos
Profissional Documentos
Cultura Documentos
SEP
DGEST
Estructura de Datos.
UNIDAD II
TEMA:
LISTAS
PRESENTA:
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.
{
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;
}
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.
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.
- Declaracin:
struct listaDE
{
int clave;
struct listaDE *ant,
*sig;
};
- Procedimiento de creacin:
{
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:
LISTAS CIRCULARES
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
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
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.