Aqui la solucion... me la paso alguien en el newsgroup de la facu
Código:
MODULE punteros;
FROM InOut IMPORT ReadCard,WriteCard, WriteString,WriteLn;
FROM Storage IMPORT ALLOCATE, DEALLOCATE;
TYPE Cardlista = POINTER TO Nodo;
Nodo = RECORD
elemen:CARDINAL;
Resto:Cardlista;
END;
VAR
l:Cardlista;
cant,i,leido:CARDINAL;
PROCEDURE Cons (x: INTEGER ; VAR L: Cardlista);
(* Inserta el elemento 'x' al comienzo de la lista 'L' *)
VAR nuevo: Cardlista;
BEGIN
NEW (nuevo);
nuevo^.elemen:= x;
nuevo^.Resto:= NIL;
IF ( L = NIL) THEN
L := nuevo;
ELSE
nuevo^.Resto := L;
L := nuevo;
END;
END Cons;
(****************************************************)
PROCEDURE ImprimirLista (L: Cardlista);
(* Imprime los elementos de la lista 'L'; en caso de que la lista sea
vacia imprime 'NIL' *)
BEGIN
IF (L = NIL) THEN (* si la lista es vacia *)
WriteString ("NIL");
ELSE (* imprimo los elementos *)
(* muestro el primer elemento, porque se que no es vacia *)
WriteCard (L^.elemen,0);
L := L^.Resto;
WHILE ( L <> NIL) DO
WriteCard (L^.elemen, 0);
L := L^.Resto;
END;
END;
(* Notar que recorro la lista con el mismo puntero 'L', ya que
este es pasado 'por copia' *)
END ImprimirLista;
(****************************************************)
(****************************************************)
PROCEDURE DestruirLista (L: Cardlista);
(* Destruye la memoria asignada a la lista 'L'*)
VAR eliminar : Cardlista;
(* variable auxiliar para recorrer la lista y eliminar la celda *)
BEGIN
WHILE ( L # NIL) DO
eliminar := L;
L := L^.Resto;
DISPOSE (eliminar);
END;
END DestruirLista;
(****************************************************)
(*Programa Principal*)
BEGIN
l:=NIL; (* inicializo variable *)
WriteString ("Ingrese un número"); WriteLn;
ReadCard(cant);
WriteLn;
FOR i:=1 TO cant DO
ReadCard (leido);
Cons (leido,l);
END;
ImprimirLista (l);
(* Una vez que no se va a usar mas la lista, hay que devolver la memoria
*)
DestruirLista (l);
END punteros.
Marcadores