Documento Completo - pdf-PDFA PDF

Descargar como pdf o txt
Descargar como pdf o txt
Está en la página 1de 18

Modulo Imperativo

Programación II - 2021

Clase de repaso
de Listas

Autores:
Alejandro Héctor Gonzalez
Silvana Gallo
Resumen
En esta clase se trabaja en un repaso los
conceptos más importantes de la
estructura de datos Listas.
Se desarrolla una explicación del
concepto de “listas de listas” que será
utilizado en el desarrollo de actividades

Palabras claves:
Listas, punteros, listas de listas, pascal
Listas - Concepto

Una lista es Colección de elementos homogéneos, con una


relación 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 lógico interno.
Listas - Concepto
Listas - Características

• Se crean a partir de punteros.


• Son estructuras donde se almacenan datos sin saber la
cantidad de los mismos.

• Son estructuras dinámicas: se reserva/libera memoria para


datos según sea conveniente.
Siempre debo GUARDAR EL PUNTERO INICIAL DE LA LISTA,
es decir el apuntador al primer nodo, PARA LUEGO PODER
RECORRERLA, ya que a partir del primer elemento se puede
acceder al siguiente y así sucesivamente.
Listas – Declaración genérica

Program ejemplo;

Type
nombreTipo = ^ nodoTipo;

nodoTipo = record
elemento : tipoElemento;
punteroSig : nombreTipo;
end;

Var
L : nombreTipo;
Listas - Ejemplo que
seguiremos
Twitter dispone de una lista con los tweets realizados durante los
últimos 5 segundos.

De cada tweet se conoce: el código y nombre de usuario que lo


generó, el contenido del mensaje y si el mismo es o no un retweet.

Esta información no tiene ningún orden y se debe tener en cuenta


que podrían existir en la lista varios tweets del mismo usuario.
Listas – Declaración del
Ejemplo
Program Twitter;
Type
tweet = record
codigoUsuario : integer;
nombreUsuario : string;
mensaje : string;
esRetweet : boolean;
end;
listaTweets = ^ nodoTweet;
nodoTweet = record
dato : tweet;
sig : listaTweets;
end;
Var
L : listaTweets;
Listas - Operaciones

• Crear lista agregando los elementos al inicio


• Crear lista agregando los elementos al final
• 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)
Repasaremos algunas de estas
operaciones en el ejemplo >>
Listas - Ejemplo que
seguiremos
Twitter dispone de una lista con los tweets realizados durante los últimos 5
segundos.

De cada tweet se conoce: el código y nombre de usuario que lo generó, el


contenido del mensaje y si el mismo es o no un retweet.

Esta información no tiene ningún orden y se debe tener en cuenta que


podrían existir en la lista varios tweets del mismo usuario.

Se desea armar a partir de la lista de tweets disponible, una lista


ordenada donde los tweets de cada usuario aparezcan de manera
consecutiva.
Listas - Ejemplo que
seguiremos
¿Cómo se crean los
tweets?

¿Cómo se insertan los elementos en la lista que


se dispone?

Ver el archivo twitter.pas


Listas – Agregar al inicio

Procedure agregarAdelante ( var l : listaTweets;


t : tweet);
var
aux : listaTweets;
begin
new(aux);
aux^.dato := t; Creo el nodo y cargo el dato

aux^.sig := l; Enlazo el siguiente y


l := aux; asigno el nuevo inicio
end;
Y luego,
¿Cómo podemos generar la nueva estructura?
Listas – Agregar ordenado

Para insertar ordenado en una lista debemos


considerar:

• Pedir espacio para el nuevo nodo


• Guardar el nuevo dato
• Buscar posición donde se debe insertar
(secuencialmente)
• Reacomodar punteros. Considerando tres casos:

• El nuevo elemento va en el inicio de la lista.


• El nuevo elemento va en el medio de dos
existentes.
• El nuevo elemento va al final de la lista.
Listas – Agregar ordenado
Procedure agregarOrdenado ( var pri : listaTweets; t : tweet);
var nuevo, anterior, actual : listaTweets;
begin Creo el nodo y
new (nuevo); nuevo^.dato:= n; nuevo^.sig := nil; cargo el dato
if (pri = nil) then
pri := nuevo
Primer elemento
else
begin
actual := pri; anterior := pri;
while (actual<>nil)and(actual^.dato.nombreUsuario < nuevo^.dato .nombreUsuario)do
begin anterior := actual;
actual:= actual^.sig; Si la lista no está vacía recorro hasta
end; encontrar la posición dónde insertar
if (anterior = actual) then (entre anterior y actual)
pri := nuevo Inserta adelante
else
f
anterior^.sig := nuevo; Inserta al medio o al final
nuevo^.sig := actual;
end; Actualiza la ref. al siguiente
end;
Listas – Recorrido

Una vez creada la lista, se imprimen sus elementos.

Procedure imprimirLista(l: listaTweets);


begin
while (l <> nil) do begin
imprimir(l^.dato); ¿Cómo es este módulo?
l:= l^.sig;
p o r va lor?
end; p a s o l a lista n o e s c ribo
¿ Po r qué ó n d e l while
end; n la cond
ic i
l)?
e ni
¿Por qué ( p r i^ . si g <>
e st e módulo?
s e ll am aa
yc ómo
¿Dónde
Listas – ejercicio de
modificación

Modifique la solución anterior para


generar una nueva estructura donde se
puedan “agrupar” los tweets de manera
tal que los datos del usuario no se
encuentren repetidos.

¿Qué estructura de datos se podría utilizar para


almacenar los tweets de un mismo usuario?

¿Cómo se puede generar la estructura de


manera eficiente?
Lista de Listas
En una lista simple donde cada dato
almacenado posee la referencia a un nuevo
tipo de lista simple interno.

ListaUsuario
alejo3 juan45 silvy27
nil
tweets tweets tweets

“Hola” “Seguidores.. “Soy…”



nil
Listas de
Tweets de “coment..” “Aqui..”
cada o s e rá la
usuario nil ¿Cóm ción de
ra
“bla bla” decla os?
tip
nil
Lista de Listas
¿Cómo se puede generar la estructura de manera
eficiente?

Se puede utilizar la lista ordenada para recorrer una


única vez todos los tweets.

Tomar los tweets contiguos de un mismo usuario e ir


generando la lista interna. Para ello hay que:

r q u e no se • Inicializar cada lista interna en nil.


Verifica atos en
d
pierdan o de • Detectar cuándo se cambia de usuario en el
s
el proce e las recorrido de la lista ordenada.
ión d
generac
listas • Agregar cada tweet a la nueva lista.

Una vez armada la lista, completar los datos


del usuario y agregarlo a la lista de usuarios.

También podría gustarte