Está en la página 1de 17

Teora 10

Estructura de datos LISTA ENLAZADA. Ejemplos

Clase 10

Programacin I

Temas que veremos hoy Definicin de tipo de dato Lista.

Caractersticas del tipo de dato Lista


Declaracin del tipo de dato Lista. Operaciones frecuentes en el tipo Lista.

Ejemplos.
Anlisis comparativo Alocacin de Memoria Esttica vs. Dinmica

Clase 10

Programacin I

Listas Enlazadas
Recordemos el ejemplo visto en la clase de punteros, se haban declarado tipos y variables y se haba analizado la memoria utilizada... Type

Estudiante = record Nombre : string [20]; Calificacion : integer end;


PtrEstudiante = ^ Estudiante; Var ArregloEstudiantes : array[1..1000]of PtrEstudiante;

Nos preguntamos: Podemos encontrar una solucin mejor, desde el punto de vista de la memoria utilizada ?
Clase 10 Programacin I 3

Listas
El concepto de una lista es bastante intuitivo ya que encontramos varios ejemplos en la vida cotidiana:
Lista de pasajeros Lista de compras Lista de alumnos

Clase 10

Programacin I

Listas

Coleccin de elementos homogneos, con una relacin lineal que los vincula, es decir que cada elemento tiene un nico predecesor (excepto el primero), y un nico sucesor (excepto el ltimo). Los elementos que la componen no ocupan posiciones secuenciales o contiguas de memoria. Es decir pueden aparecer dispersos en la memoria, pero mantienen un orden lgico interno.
Stack Heap

nil

Puntero inicial
Clase 10 Programacin I 5

Anlisis comparativo Listas - Arreglos


Homognea Arreglos Esttica Lineal

Homognea Listas
Dinmica Lineal

Cmo y dnde se almacenan los datos en cada una de las estructuras?


Clase 10 Programacin I 6

Anlisis comparativo Listas - Arreglos


Cmo y dnde se almacenan los datos?
Los arreglos sabemos que se almacenan en memoria esttica. La ocupacin de memoria de resuelve en tiempo de compilacin. Ocupan posiciones consecutivas de memoria.

Tem

1 2

.......

30

nil

Las listas se almacenan en memoria dinmica. La ocupacin de memoria se resuelve en tiempo de ejecucin. Se disponen aleatoriamente en memoria. Se relacionan lgicamente.

Clase 10

Programacin I

Anlisis comparativo Listas - Arreglos


Qu diferencias encontramos al agregar un elemento al inicio de un vector y de una lista? Pasos a seguir: V 2 1 5 2 3 3 1. Verificar si tenemos espacio para almacenar el nuevo elemento (DimLog+1<=DimFis)

4 .......

23

2. Abrir espacio (corrimiento) 3. Poner el nuevo elemento (6) 4. Incrementar Dim. Logica.

Dim Logica

Cul es el paso que consume mas tiempo en esta operacin? Analicemos los pasos a seguir para agregar al inicio de una Lista...
Clase 10 Programacin I 8

Anlisis comparativo Listas - Arreglos


Qu diferencias encontramos para acceder al k-simo elemento en un vector y en una lista?

K=2
Arreglos
Acceso Directo

Listas
Acceso Secuencial

nil

Tem

1 2

Se resuelve simplemente: Tem[2]


Clase 10

Se debe recorrer desde el principio hasta llegar a la posicin K.


Programacin I 9

Listas
La idea bsica de las estructuras enlazadas:

Estn compuesta por nodos Los nodos se conectan por medio de enlaces o punteros Cuando se necesita espacio adicional, nuevos nodos pueden ser alocados y agregados a la estructura (New) Cuando existen nodos que ya no se necesitan, pueden ser borrados, liberando memoria (Dispose) Siempre se debe conocer la direccin del primer nodo de la lista (puntero inicial) para acceder a la informacin de la misma El ltimo nodo de la lista se caracteriza por tener su enlace en Nil

Clase 10

Programacin I

10

Listas
Declaracin en Pascal de una lista de enteros
Program Ej1; Type Lista= ^Nodo; Nodo= Record Datos: integer; {contenido} Direccion: Lista; {direccin del siguiente nodo} End; Var L: Lista; {Memoria esttica reservada para el puntero inicial}

Clase 10

Programacin I

11

Listas Enlazadas
En general:

Type info = ; Lista = ^ nodo; nodo = record Datos : info; Direccion : Lista; End;
Var P : Lista;

Clase 10

Programacin I

12

Listas - Operaciones
Crear una lista Insertar un nuevo elemento en una lista ordenada

Recorrer una lista


Acceder al k-simo elemento de la lista Eliminar un elemento de la lista

Combinar dos listas ordenadas formando una sola ordenada (Merge de Listas)

Clase 10

Programacin I

13

Recorrido de una Lista Enlazada


Se recorre la lista desde el primer nodo al ltimo. Se debe utilizar un puntero para acceder a cada nodoLa primera vez ese puntero se inicializa con el valor del puntero inicial a la lista.
Supongamos la declaracin:
Type persona= record nom: string[50]; edad: integer end; lista= ^reg; reg = record datos: persona; sig: lista; end ;
Clase 10

Procedure recorrido ( pri : lista); var nue : lista;


Observar

Begin Recorre hasta el final nue := pri; while (nue <> NIL) do begin write (nue^.datos.nom, nue^.datos.edad) ; nue := nue^.sig end; end;
Programacin I 14

Bsqueda de un elemento en una Lista


Se recorre la lista desde el primer nodo hasta encontrar el elemento o bien hasta llegar al ltimo nodo. Se debe utilizar un puntero para acceder a cada nodo
Supongamos la declaracin: Type persona= record nom: string[50]; edad: integer end; lista = ^reg; function buscar ( pri: lista; x: nom1): boolean; Var encontre : boolean; nue : lista;

Observar

reg = record datos: persona; sig: lista; end ; nom1 : string[50];


Clase 10

begin encontre := false; nue := pri; while ( not encontre ) and ( nue <> NIL ) do if x = nue^.datos.nom then encontre := true else nue := nue^.sig; buscar := encontre end;
Programacin I 15

Crear una Lista Enlazada


La operacin de Creacin de una Lista admite distintas opciones:
Crear Crear Crear Crear una una una una Lista Lista Lista Lista Vaca agregando elementos al inicio agregando elementos al final ordenada por algn criterio

La operacin de Crear Lista Vaca es simplemente asignarle Nil a su puntero inicial. Por ejemplo:
Begin ...... L:=nil; ..... End.
Clase 10 Programacin I 16

Observar que no se usa NEW

Crear una Lista agregando al inicio


Supongamos que se ingresan nmeros enteros (de teclado) hasta que se ingresa el valor 0 y se pide que se vayan agregando al principio de una lista...(Utiliza un proceso de AgregarAdelante)
Program Ej1; Type Lista= ^Nodo; Nodo= Record Datos: integer; Sig: Lista; End; Var L: Lista; n: integer; Var nue:Lista; Begin New(nue); nue^.datos:=num; nue^.sig:=L; L:=nue; End; Procedure AgregarAdelante Begin L:=nil; readln (n); While (n<>0) do Begin AgregarAdelante (L, n); readln (n); End; End. AgregarAdelante recibe como parmetros el puntero inicial de la lista y el nmero que se guarda
17

(var L:lista; num:integer);

Clase 10

Programacin I