Buenas, con unos amigos hicimos el ejercicio 2 y nos quedó diferente que en la solución. Tenemos una duda puntual y otra general. La puntual es si podríamos hacer la instrucción "new(lis)" cuando antes lis ya estaba apuntando a NIL. Y la segunda es si está bien cómo resolvimos nosotros el ejercicio (al ser diferente a la solución no estamos seguros, pero según nosotros funciona).
Les paso el código (perdonen la indentación pero no logré hacerla bien acá, espero se entienda igual):
procedure NumeroAlCuadrado (VAR list : Lista; r : Real);
VAR
p, q : Lista;
BEGIN
if lis <> NIL then
begin
p := lis;
while (p^.dato<>r) and (p^.sig<>NIL) do
p := p^.sig;
if p^.dato=r then
p^.dato := r*r
else
begin
new(q);
q^.sig := NIL;
q^.dato := r;
p^.sig := q;
end;
end else
begin
new(lis);
lis^.sig := NIL;
lis^.dato := r;
end;
END;