You are on page 1of 31

Tema 4: La estructura de datos

Lista
Estructura de Datos
Ingeniera de Informtica

TAD Lista

LISTA = coleccin de elementos homogneos


entre los que existe una relacin lineal
Cada elemento de la lista, a excepcin del primero,
tiene un nico predecesor
Cada elemento de la lista, a excepcin del ltimo, tiene
un nico sucesor

Nodos y enlaces

Estructura de

Listas - 2

Listas: descripcin lgica

Orden de nodos afecta a la funcin de acceso


Segn orden de insercin
Segn clave

Ejemplo
Lista de calificaciones ::= <Alumno> + {<Alumno>}
<Alumno>::= <<DNI>> + <<NIA>> + <Apellido1> +
<Apellido2> + <Nombre> + <Calificacin>

Estructura de

Listas - 3

Listas: descripcin lgica

Listas Arrays
Listas son flexibles y permiten cambio de
implementacin

Operaciones
Insertar, Borrar, Modificar, etc.

Tipos de listas
Simples
Ordenadas
Pilas
Colas
Doblemente enlazadas (LDE)
Circulares

Estructura de

Listas - 4

Implementaciones
Esttica

Dinmica
tamao = 3
max = 8

Secuencial

tamao = 4
max = 4

tamao = 3
elem[i] =
i=

min

+1

+2

...

...

...

elem[i] =

i=

T
8

posicin = i

max

posicin = i

Vector original
Vector ampliado

Enlazada

tamao = 5

tamao = 3
elem[i] =

i=

N 5

max

N
I

U
posicin

null

posicin = i

Estructura de

Listas - 5

Listas Simples

Lista Simple = coleccin de elementos


homogneos cuya relacin lineal es determinada
por la posicin del elemento en la lista
Comienzo + Enlace al siguiente ( puntero)

Definicin:

<listaSimple> ::= <comienzo> + {<nodo>}


<nodo> ::= <informacion> + <enlace>
<informacion> ::= <<dato>>{<<dato>>}
<enlace> ::= (<<ReferenciaNodo>> | NULL)
<comienzo> :: =<enlace>

Estructura de

Listas - 6

TAD Lista Simple: operaciones


Creacin de una lista

crearLista (nombreLista)

Comprobacin del estado

listaVacia(nombreLista) Booleano
listaVacia(referenciaNodo) Booleano
listaLlena(nombreLista) Booleano

Insercin de nodos

insertar(nombreLista, valorInfo, posicion)


insertar(nombreLista, valorInfo)

Borrado de nodos

borrar(nombreLista, valorInfo)

Bsqueda de un nodo

buscar(nombreLista, dato) informacion


buscar(nombreLista, dato) referenciaNodo
pertenece(nombreLista,informacion) Booleano

Recorrido de la lista

recorrer(nombreLista)

Acceso a los nodos

info(referenciaNodo) Informacion
siguiente(referenciaNodo) enlace

Modificacin de los nodos

asignarInfo(referenciaNodo, valorInformacion)
asignarEnlace(referenciaNodo, valorEnlace)

Estructura de

Listas - 7

Listas Simples

Aclaraciones a las operaciones:


listaLlena slo tiene sentido si lista es acotada
acceso y modificacin sern mtodos get y put

Ejemplo y pseudocdigo
insertar (nombreLista, valorInfo, posicin)
insertar (nombreLista, valorInfo)
borrar (nombreLista, valorInfo)
buscar (nombreLista, dato)
recorrer (nombreLista)

Insercin: casos

Estructura de

Listas - 8

Estructura de

Listas - 9

Estructura de

Listas - 10

Listas Ordenadas

La posicin de cada nodo viene determinada por el valor


de uno o ms campos obligatorios de informacin del nodo
denominados clave
No se permite tener dos nodos con la misma clave

Definicin

<listaOrdenada> ::= <comienzo> + {<nodo>}


<comienzo> ::= <enlace>
<enlace> ::= (<<ReferenciaNodo>> | NULL)
<nodo> ::= <clave> + <informacion> + <enlace>
<clave> ::= <<dato>>{<<dato>>}
<informacion> ::= {<<dato>>}

Estructura de

Listas - 11

TAD Lista Ordenada: operaciones


Creacin de una lista

crearLista (nombreLista)

Comprobacin del estado

listaVacia(nombreLista) Booleano
listaVacia(referenciaNodo) Booleano
listaLlena(nombreLista) Booleano

Insercin de nodos

insertar(nombreLista, valorClave, valorInfo)

Borrado de nodos

borrar(nombreLista, valorClave)

Bsqueda de un nodo

buscar(nombreLista, valorClave) Informacion


buscar(nombreLista, valorClave) ReferenciaNodo
pertenece(nombreLista,valorClave) Booleano

Recorrido de la lista

recorrer(nombreLista

Acceso a los nodos

clave(referenciaNodo) Clave
info(referenciaNodo) Informacion
siguiente(referenciaNodo) enlace

Modificacin de los nodos

asignarClave(referenciaNodo, valorClave)
asignarInfo(referenciaNodo, valorInformacion)
asignarEnlace(referenciaNodo, valorEnlace)

Estructura de

Listas - 12

Pilas

Pila = coleccin ordenada de elementos homogneos en la


que slo se pueden aadir y eliminar elementos por el
principio de la misma (cabecera) filosofa LIFO

Definicin
<pila> ::= <cabecera> + {<nodo>}
<cabecera> ::= <enlace>
<enlace> ::= (<<ReferenciaNodo>> | NULL)
<nodo> ::= <informacion> + <enlace>
<informacion> ::= <<dato>>{<<dato>>}

Estructura de

Listas - 13

TAD Pila: operaciones


Creacin de pila

crearPila (nombrePila)

Comprobacin del estado

pilaVacia(nombrePila) Booleano
pilaLlena(nombrePila) Booleano

Insercin de nodos

push(nombrePila, valorInfo)

Extraccin de nodos

pop(nombrePila) informacion

Acceso a la cabecera*

cabecera(nombrePila) informacion

* Opcional: Accede a la cabecera sin eliminarla

Acceso a los nodos

info(referenciaNodo) Informacion
siguiente(referenciaNodo) Enlace

Modificacin de los nodos

asignarInfo(referenciaNodo, valorInformacion)
asignarEnlace(referenciaNodo, valorEnlace)

Estructura de

Listas - 14

TAD Pila: ejemplos de aplicacin

Vuelta atrs en un navegador web

Comando undo en un editor

Secuencia de mtodos activos en la Java Virtual Machine:


main() {
int i = 5;
foo(i);
}
foo(int j) {
int k;
k = j+1;
bar(k);
}
bar(int m) {

Estructura de

bar
PC = 1
m=6
foo
PC = 3
j=5
k=6
main
PC = 2
i=5

Cuando se invoca un mtodo, se


inserta en la pila una nueva entrada
Por cada mtodo se guardan:
variables locales
valor devuelto
contador de programa
Cuando el mtodo finaliza se saca
ese elemento de la pila y se devuelve
el control al mtodo que est en la
cabecera

Listas - 15

Colas

Cola = coleccin ordenada de elementos homogneos en la


que slo se pueden aadir elementos por el final y se
eliminan por el principio (frente) filosofa FIFO

Definicin
<cola> ::= <frente> + <final> + {<nodo>}
<frente> ::= <enlace>
<enlace> ::= (<<ReferenciaNodo>> | NULL)
<final> ::= <enlace>
<nodo> ::= <informacion> + <enlace>
< informacion > ::= <<dato>>{<<dato>>}

Estructura de

Listas - 16

TAD Cola: operaciones


Creacin de cola

crearCola (nombreCola)

Comprobacin del estado

colaVacia(nombreCola) Booleano
colaLlena(nombreCola) Booleano

Insercin de nodos

encolar(nombreCola, valorInfo)

Extraccin de nodos

desencolar(nombreCola) informacion

Acceso a la cabecera*

cabecera(nombreCola) informacion

* Opcional: Accede a la cabecera sin eliminarla

Acceso a los nodos

info(referenciaNodo) Informacion
siguiente(referenciaNodo) Enlace

Modificacin de los nodos

asignarInfo(referenciaNodo, valorInformacion)
asignarEnlace(referenciaNodo, valorEnlace)

Estructura de

Listas - 17

TAD Cola: casos particulares

Colas circulares
Implementacin esttica como array
Referencia al primero y al ltimo
Aritmtica mdulo C (Capacidad de la cola)
Llevar la cuenta del nmero de elementos

Estructura de

Listas - 18

TAD Cola: casos particulares

Colas de prioridad

Estructura de

Listas - 19

TAD Cola: ejemplos de aplicacin

Listas de espera
Acceso a recursos compartidos dedicados (v.g.,
impresoras)
Multiprogramacin de la CPU

Estructura de

Listas - 20

Listas Doblemente Enlazadas

Relacin lineal en ambos sentidos


Enlace a predecesor y antecesor en cada nodo
Recorrido puede ser en ambos sentidos
Pueden ser simples u ordenadas

Definicin:

<lde> ::= <comienzo> + {<nodo>}


<comienzo> :: = <enlace>
<enlace> ::= (<<ReferenciaNodo>> | NULL)
<nodo> ::= <informacion> + <predecesor> + <sucesor>
<predecesor> ::= <enlace>
<sucesor> ::= <enlace>
<informacion> ::= <<dato>>{<<dato>>}

Estructura de

Listas - 21

LDE: operaciones
Creacin de una lista

crearLista(nombreLista)

Comprobacin del estado

listaVacia(nombreLista) Booleano
listaVacia(referenciaNodo) Booleano

Insercin de nodos

listaLlena(nombreLista) Booleano
insertar(nombreLista, valorInfo, posicion)
insertar(nombreLista, valorInfo)

Borrado de nodos

borrar(nombreLista, valorInfo)

Bsqueda de un nodo

buscar(nombreLista, dato) informacion


buscar(nombreLista, dato) referenciaNodo

Recorrido de la lista

pertenece(nombreLista,informacion) Booleano
recorrer(nombreLista, sentido)

Acceso a los nodos

info(referenciaNodo) Informacion
anterior(referenciaNodo) enlace

Modificacin de los nodos

Estructura de

siguiente(referenciaNodo) enlace
asignarInfo(referenciaNodo, valorInformacion)
asignarAnterior(referenciaNodo, valorEnlace)
asignarSiguiente(referenciaNodo, valorEnlace)

Listas - 22

Tcnicas de Simplificacin

Algunos elementos (principio y final) se tratan


como casos especiales al implementar las
operaciones
Rediseo de estructuras para que los elementos
terminales se traten igual que el resto
Estructuras auxiliares
Centinelas
Cabeceras

Estructura de

Listas - 23

Tcnicas de Simplificacin (i)

Bsqueda en lista ordenada: evaluar dos condiciones


buscar(nombreLista, valorClave) informacion
INICIO
posicion nombreLista.comienzo
continuar CIERTO
MIENTRAS NO(listaVacia(posicion)) Y continuar)
SI (clave(posicion) < valorClave)
ENTONCES posicion siguiente(posicion)
SI NO
continuar FALSO
SI(clave(posicion) = valorClave)
ENTONCES DEVOLVER informacion(posicion)
SI NO DEVOLVER error ese nodo no est en la lista
FIN-SI
FIN-SI
FIN-MIENTRAS
FIN

Estructura de

Listas - 24

Centinela en listas ordenadas

Centinela = nodo auxiliar al final de la lista

Para buscar un elemento:


Colocar en el centinela el valor buscado
Condicin de terminacin: se encuentra el valor
buscado o uno mayor
Si se llega al centinela, el elemento no est en la lista

Ejemplo e Implementacin

Estructura de

Listas - 25

Centinelas: ejemplos

Buscar(comienzo, 15, centinela, posicin)


Buscar(comienzo, 50, centinela, posicin)

Estructura de

Listas - 26

Tcnicas de simplificacin (ii)

Insercin en lista ordenada: caso especial


insertarPosicion (nombreLista, valorClave, valorInfo,
anterior, posterior)
// Coloca el nodo entre anterior y posterior. Si anterior
es vaco, entonces nodo ser el primer elemento de la
lista, si posterior es vaco ser el ltimo
INICIO
nodo nuevoNodo(valorClave, valorInfo)
asignarEnlace(nodo, posterior)
SI listaVacia(anterior)
ENTONCES nombreLista.comienzo nodo
SI NO
asignarEnlace(anterior, nodo)
FIN SI
FIN

Estructura de

Listas - 27

Cabecera en listas ordenadas

Cabecera = nodo auxiliar situado al principio de


la lista, cuyos contenidos (clave e info) no
pertenecen a la lista

Consecuencias:
No hace falta marcar comienzo
No hace falta caso especial cuando lista es vaca

Estructura de

Listas - 28

Cabeceras: ejemplos

insertarElemento (cabecera, 7)

insertarElemento (cabecera, 1)

Estructura de

Listas - 29

Cabecera + centinela

Usar el mismo nodo auxiliar como cabecera y


centinela
Convertir la lista en circular

Estructura de

Listas - 30

Otras tcnicas de simplificacin

Insercin ordenada sin puntero al anterior


Buscar posicin del primer elemento mayor que la clave a
insertar, colocar un nodo nuevo detrs e intercambiar

Borrado sin puntero al anterior


Buscar posicin del elemento a borrar
Copiar informacin del siguiente a esa posicin
Borrar el siguiente
(no funciona para borrar el ltimo elemento hay que usar
centinela)

Estructura de

Listas - 31