Loading documents preview...
1
Otros TADs relacionados con listas: Listas enlazadas m´ ultiples y listas multiordenadas Dadas las siguientes representaciones gr´aficas se propone como ejercicio hacer la declaraci´on 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 inform´atico, siendo sus datos su login y password encriptada. Para cada uno de ellos, adem´as, guardaremos la lista de los trabajos que tiene en ese momento en ejecuci´on. En este caso, para cada trabajo guardaremos su identificador y la carga m´axima de CPU que supone. La estructura de datos se corresponde con la mostrada en la Figura 1.
ant
lista
login1
login2
login3
pass1
pass2
pass3
sig
trabajos
id_trabajo1
ant
sig
trabajos
ant
sig
trabajos
id_trabajo2
load1
load2
sig_trabajo
sig_trabajo
id_trabajo1
id_trabajo2
load1
load2
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 tendr´an tantos campos de enlace como claves de ordenaci´on. c) Cada campo de enlace mantiene la lista ordenada por uno de los criterios. d ) Existe un nodo de cabecera que ser´a un registro con tantos campos como claves de ordenaci´on existan. En este caso, nos interesa mantener una lista de personas ordenadas por apellido y tambi´en por DNI, tal como se refleja en la Figura 2. El nodo de cabecera ser´ıa 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
blanco
signom nil
antnom
pérez
signom
lópez
dir 1
dir 2
dir 3
32.xxx.xxx
33.xxx.xxx
30.xxx.xxx
antDNI
sigDNI
antDNI
sigDNI nil
nil antDNI
P nombre
sigDNI
DNI
Figura 2: Lista de personas ordenada por dos criterios: apellido y DNI 3. En este ejemplo manejaremos una multilista que, a su vez est´a multiordenada (ordenada por varios criterios). Se trata de un ambulatorio en el que se desea asociar asegurados con m´edicos, de manera que podamos acceder a la lista de m´edicos del seguro, a la lista de pacientes del seguro y, adem´as, a la lista de pacientes que son atendidos por un determinado m´edico. La estructura se refleja en la Figura 3. Como se puede observar, se mantienen dos listas doblemente enlazadas: una para los asegurados y otra para los m´edicos. Para facilitar la b´ usqueda de m´edicos y pacientes ambas listas est´an ordenadas: la lista de m´edicos est´a ordenada alfab´eticamente por apellido y la de pacientes por DNI. Adem´as, para poder saber qu´e pacientes atiende qu´e m´edico, cada nodo m´edico tiene un puntero al nodo del primer asegurado asociado, y cada nodo de asegurado tiene un enlace al siguiente asegurado al que le atiende el mismo m´edico. Lista_médicos 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
paciente
paciente
25 nil
paciente
nil
Figura 3: En esta figura el m´edico A atiende a los pacientes X e Y, el m´edico B atiende al pacientes Z, y el m´edico C no tiene ning´ un paciente.
3
Soluciones 0.1.
Ejercicio 1: lista de usuarios y sus trabajos
La definici´on de tipos ser´ıa la siguiente. En primer lugar, crear´ıamos el TAD necesario 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: informaci´ on del ambulatorio.
Este ejemplo est´a 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 definici´on de tipos ser´ıa: 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 .