Está en la página 1de 6

1

Otros TADs relacionados con listas: Listas enlazadas


multiples y listas multiordenadas

Dadas las siguientes representaciones graficas se propone como ejercicio hacer la


declaracion de los tipos de las units implicadas:

1. Este ejemplo se trata de una multilista (lista compuesta de listas) que utilizaremos
para mantener la lista de los usuarios de un sistema informatico, siendo sus datos su
login y password encriptada. Para cada uno de ellos, ademas, guardaremos la lista de
los trabajos que tiene en ese momento en ejecucion. En este caso, para cada trabajo
guardaremos su identificador y la carga maxima de CPU que supone. La estructura
de datos se corresponde con la mostrada en la Figura 1.

login1 login2 login3


pass1 pass2 pass3
ant sig ant sig ant sig
trabajos trabajos trabajos
lista

id_trabajo1 id_trabajo2
id_trabajo1 id_trabajo2
load1 load2
load1 load2
sig_trabajo sig_trabajo
sig_trabajo sig_trabajo

Figura 1: Multilista de usuarios y trabajos

2. En este ejercicio manejaremos listas multiordenadas. En estas listas:

a) Los elementos se encuentran ordenados por distintos criterios


b) Los nodos tendran tantos campos de enlace como claves de ordenacion.
c) Cada campo de enlace mantiene la lista ordenada por uno de los criterios.
d ) Existe un nodo de cabecera que sera un registro con tantos campos como claves
de ordenacion existan.

En este caso, nos interesa mantener una lista de personas ordenadas por apellido
y tambien por DNI, tal como se refleja en la Figura 2. El nodo de cabecera sera
un registro con dos punteros, uno al principio de la lista de registros ordenados por
nombres y otro a la lista de los mismos registros pero ordenados por edad.
2

nilantnom signom antnom signom nil antnom signom

blanco prez lpez


dir 1 dir 2 dir 3
32.xxx.xxx 33.xxx.xxx 30.xxx.xxx P
antDNI sigDNI antDNI sigDNI nil nil antDNI sigDNI nombre
DNI

Figura 2: Lista de personas ordenada por dos criterios: apellido y DNI

3. En este ejemplo manejaremos una multilista que, a su vez esta multiordenada (or-
denada por varios criterios). Se trata de un ambulatorio en el que se desea asociar
asegurados con medicos, de manera que podamos acceder a la lista de medicos del
seguro, a la lista de pacientes del seguro y, ademas, a la lista de pacientes que son
atendidos por un determinado medico. La estructura se refleja en la Figura 3. Como
se puede observar, se mantienen dos listas doblemente enlazadas: una para los ase-
gurados y otra para los medicos. Para facilitar la busqueda de medicos y pacientes
ambas listas estan ordenadas: la lista de medicos esta ordenada alfabeticamente por
apellido y la de pacientes por DNI. Ademas, para poder saber que pacientes atiende
que medico, cada nodo medico tiene un puntero al nodo del primer asegurado asocia-
do, y cada nodo de asegurado tiene un enlace al siguiente asegurado al que le atiende
el mismo medico.

Lista_mdicos

nilantmed sigmed antmed sigmed antmed sigmednil

A B C
dir 1 dir 2 dir 3
27 31 25
paciente paciente paciente

Lista_asegurados

nilantaseg sigaseg antaseg sigaseg antaseg sigasegnil

X Z Y
dir 1 dir 2 dir 3
27 31 25
paciente paciente nil paciente nil

Figura 3: En esta figura el medico A atiende a los pacientes X e Y, el medico B atiende al


pacientes Z, y el medico C no tiene ningun paciente.
3

Soluciones

0.1. Ejercicio 1: lista de usuarios y sus trabajos

La definicion de tipos sera la siguiente. En primer lugar, crearamos el TAD nece-


sario para mantener la lista de trabajos:
Unit L i s t a T r a b a j o s ;
interface
const
nul o=n i l ;
type
tId = integer ;
tLoad = r e a l ;
tPosTrabajo = tNodoTrabajo ;
tInfoTrabajo = record
id : tId ;
l o a d : tLoad ;
end ;
tNodoTrabajo = r e c o r d
Info : tInfoTrabajo ;
s i g : tPosTrabajo ;
end ;
t L i s t a T r a b a j o s = tPosTrabajo ;
{ operaciones }
p r o c e d u r e L i s t a T r a b a j o s V a c i a ( var L : t L i s t a T r a b a j o s ) ;
...
implementation
...
end .
4

Unit L i s t a U s u a r i o s ;
uses ListaTrabajos ;
interface
const
nul o=n i l ;
type
tLogin = s t r i n g [ 1 0 ] ;
tPass = s t r i n g [ 1 0 ] ;
tInfoUsuario = record
l o g i n : tLogin ;
pass : tPass ;
end ;
t P o s U s u a r i o = tNodoUsuario ;
tNodoUsuario = r e c o r d
Info : tinfousuario ;
ant , s i g : t P o s U s u a r i o ;
trabajos : tListaTrabajos ;
end ;
t L i s t a U s u a r i o s = tPosUsuario ;
{ operaciones }
p r o c e d u r e L i s t a T r a b a j o s V a c i a ( var L : t L i s t a T r a b a j o s ) ;
...
implementation
...
end .

0.2. Ejercicio 2: Lista Multiordenada


Unit L i s t a M u l t i o r d e n a d a ;
interface
const
nul o=n i l ;
type
tNombre : s t r i n g [ 2 5 ] ;
tDir : s t r i n g [ 4 0 ] ;
tDNI : i n t e g e r ;
ti n fo = record
Nombre : tNombre ;
d i r e c c i o n : tDir ;
DNI : tDNI ;
end ;
tPos = tNodo ;
tNodo = record
Info : tinfo ;
antnombre , signombre : tPos ;
antDNI , sigDNI : tPos ;
5

end ;
tLista = record
nombre : tPos ;
DNI : tPos ;
end ;
...
implementation
...

0.3. Ejercicio 3: informacion del ambulatorio.

Este ejemplo esta tomado del Joyanes. En el libro aparecen tanto las dos unit
desarrolladas como las funciones para hacer consultas a las listas y dar altas. La definicion
de tipos sera:
unit ListaAsegurados ;
interface
interface
const
nulo=n i l ;
type
tNombre : s t r i n g [ 2 5 ] ;
tDir : s t r i n g [ 4 0 ] ;
tDNI : i n t e g e r ;
tinfoAsegurado = record
Nombre : tNombre ;
d i r e c c i o n : tDir ;
DNI : tDNI ;
end ;
tPosAsegurado = tNodoAsegurado ;
tNodoAsegurado = r e c o r d
info : tinfoAsegurado ;
antAsegurado , s i g A s e g u r a d o : tPosAsegurado ;
s i g P a c i e n t e : tPosAsegurado ;
end ;
t L i s t a A s e g u r a d o s = tPosAsegurado ;
...
end .
6

unit ListaMedicos ;
interface
uses ListaAsegurados ;
type
tinfoMedico = tinfoAsegurado ;
tPosMedico = tNodoMedico ;
tNodoMedico = r e c o r d
info : tinfoMedico ;
antMedico , s i g M e d i c o : tPosMedico ;
pacientes : tListaAsegurados ;
end ;
...
end .