You are on page 1of 12

ADP 2013

Listas

Ejercicio 1
Leer

una

secuencia

de

nmeros

almacenarlos en una lista. La secuencia


termina cuando llega el -1

(el cual no debe

almacenarse). Una vez generada dicha lista

informar los nmeros ledos en el orden


inverso al ledo.

Analizando el problema
Supongamos que llegan los nmeros:

22,

11,

15,

3, -1

agrego adelante Cmo se va formando la lista?


P
ri

P
ri

P
ri

15

Los elementos quedan en el orden

11

Pri
P
=
ri NlL

la lista
Inicialmente
ntra
Pri se encue
vaca

22

NIL

inverso al que se los lee.

Solucin
propuesta
Program uno;
{TIPOS DEFINIDOS POR EL USUARIO}
type
lista = ^nodo;
nodo = record
dato: integer;
sig : lista;
end;

{PROCEDIMIENTOS Y FUNCIONES}
procedure agregarAdelante(var pri:lista;
num:integer);

var
aux: lista;
begin
new (aux); {creo el nodo}
aux^.dato := num; {cargo el dato}
aux^.sig := pri; {engancho}
pri := aux; {actualizo el primero}
end;

{VARIABLES DEL PROGRAMA PRINCIPAL


var
pri : lista;
num : integer;
begin {PROGRAMA PRINCIPAL}
pri := nil;
read(num);
while (num <> -1) do begin
agregarAdelante(pri, num)
read (num);
end;
imprimir (pri);
end.

Solucin
propuesta
procedure imprimir (l: lista);
begin
writeln('---------- LISTADO ----------');
while (l <> nil ) do begin
writeln ('Numero: ', l^.dato);
l := l^.sig;
{avanzo}
end;
end;

Ejercicio 3
Se dispone de una lista de empleados. De cada
empleado se conoce dni y categora (1..5).
Adems se dispone de una tabla donde por cada
categora se tiene el sueldo bsico.
Se pide recorrer la lista e informar para cada dni
cual es el sueldo bsico a cobrar.

Solucin
propuesta
Program uno;
{TIPOS DEFINIDOS POR EL USUARIO}
Type
tipoCat = 1..5;
tipoSueldoB = array[tipoCat] of real;
listaEmp = ^nodoEmp;
nodoEmp = record
dni: integer;
cat: tipoCat;
sig : listaEmp;
end;

{VARIABLES DEL PROGRAMA PRINCIPAL}


var
suel: tipoSueldoB;
lEmp: listaEmp;
begin {PROGRAMA PRINCIPAL}
lEmp:= nil;
cargarSueldos(suel); //se dispone
cargarEmp(lEmp);

//se dispone

procesarEmpleados(lEmp, suel);
end.

Solucin
propuesta

Qu sucede si la lista es pasada por referencia?

procedure procesarEmpleados(lEmp: listaEmp, suel: tipoSueldoB );


Begin
writeln('---------- LISTADO ----------');
while (lEmp <> nil ) do begin
writeln('El empleado ', lEmp^.dni,' debe cobrar: $',
suel[lEmp^.cat]);
lEmp := lEmp^.sig;
end;
end;

{avanzo}

Ejercicio 4
Se dispone de una lista de alumnos que se
presentaron a una mesa de final de la materia x.
De cada alumno se conoce: nro de alumno y nota.
Se pide recorrer la lista y generar dos listas nuevas,
una con los alumnos aprobados y otra con los
desaprobados.

Solucin
propuesta
Program uno;
{TIPOS DEFINIDOS POR EL USUARIO}
Type
tipoNota: 1..10;
alumno = record
nro: integer;
nota: tipoNota;
End;
listaAlu = ^nodoAlu;
nodoAlu = record
alu: alumno;
sig : listaAlu;
end;

{VARIABLES DEL PROGRAMA PRINCIPAL}


var
lAlu, lAluAp, lAluDes : listaAlu;
begin {PROGRAMA PRINCIPAL}
lAlu:= nil;
cargarAlumnos(lAlu);

//se dispone

lAluAp:= nil;
lAluDes:= nil;
procesarAlumnos(lAlu, lAluAp,
lAluDes);
end.

Solucin
propuesta

Qu sucede si las listas son pasadas por valor?

procedure procesarAlumnos(lAlu: listaAlu, var lAluAp, lAluDes:


listaAlu);
Begin
while (lAlu <> nil ) do begin
if(lAlu^.alu.nota < 4) then
agregar(lAluDes, lAlu^.alu); {Agrego en la lista de desap}
else
agregar(lAluAp, lAlu^.alu); {Agrego en la lista de
aprobados}
lAlu := lAlu^.sig;
end;

{avanzo}

PREGUNTAS?

You might also like