{$mode objfpc}{$H-}{$R+}{$T+}{$Q+}{$V+}{$D+}{$X-}{$warnings on}
program punteros_01;

type
    TipoLista = ^TipoNodo;  // TipoLista es un puntero a un nodo

    TipoNodo = record    
        valor: integer;    // El valor que nos interesa
        sig: TipoLista;    // Puntero al siguiente nodo
    end;

procedure inicia_lista(var lista:TipoLista);
begin
    lista := nil;
end;

procedure aniade_elemento(var lista:TipoLista; valor:integer);
var
    nodo : TipoLista;
begin
    new(nodo);             // Reservamos memoria para un nuevo nodo
    nodo^.valor := valor;  // Le damos su valor
    nodo^.sig := lista;    // Enlazamos el nodo a la cadena
    lista := nodo;         // Ahora la lista empieza por el nuevo nodo
end;

procedure recorre_lista(var lista:TipoLista);
begin
    while (lista <> nil) do begin  // Mientras no estemos al final de la lista
        writeln(lista^.valor);     // Procesamos el nodo
        lista := lista^.sig;       // Pasamos al siguiente elemento
    end;
end;
        

procedure libera_lista(var lista:TipoLista);
var
    previo : TipoLista;
begin
    while (lista <> nil) do begin
        previo := lista;       // Guardamos el elemento anterior
        lista := lista^.sig;   // La lista apunta al siguiente
        dispose(previo);       // Borramos el anterior
    end;
end;

var
    lista : TipoLista;

begin
    inicia_lista(lista);
    aniade_elemento(lista, 1);
    aniade_elemento(lista, 2);
    aniade_elemento(lista, 3);
    
    recorre_lista(lista);
    libera_lista(lista);
end.
