Se così può essere più chiaro:
codice:
{Il programma accetta in ingresso dei valori interi e li ordina direttamente in
ordine crescente(con insertion sort).L'immissione termina con il valore zero.
La lista creata viene visualizzata.}

program lista_ordin;
{$APPTYPE CONSOLE}
uses SysUtils;

type
  puntatore= ^elemento;
//Struttura degli elemnti della lista
  elemento=record
     inf:integer;
     pun:puntatore;
   end;

//Funzione per la creazione della lista ord.Restituisce il puntatore alla testa
Function crea_lista_ordin: puntatore;
var
  p,q: puntatore;
  paus: puntatore;  //puntatore ausiliario
  x: integer;       //contiene il valore da inserire

begin
p:=NIL;            //Inizializzazione lista vuota

writeln;
write('Inserire primo elemento della lista(0 per terminare): ');
readln(x);
//Creazione del primo elemento della lista:quello in testa
 if x<>0 then begin
 new(p);
 p^.inf:=x;
 p^.pun:=NIL;
write('Inserire un altro elemento nella lista(0 per terminare): ');
readln(x);
 end;

//Ciclo per la creazione degli elementi successivi
while x<>0 do begin
//Creazione nuovo spazio di memoria
new(paus);
paus^.inf:=x;

//Inserimento nella lista
if x<p^.inf then begin      //Se il valore immesso è minore di quello che c'era
paus^.pun:=p;               //in testa allora, il puntatore alla testa viene
paus:=p;                    //aggiornato (paus^.pun:=p) in maniera tale che paus
end                         //punti adesso pure alla testa (p:=paus)
else begin

//Ricerca del punto di inserimento
q:=p;
 while ((q^.pun)<>NIL) AND ((q^.pun)^.inf<x) do
 q:=q^.pun;
//Inserimento elemento interno nella lista
paus^.pun:=q^.pun;
q^.pun:=paus;
 end;

//Lettura nuovo elemento
write('Inserire altro elemento nella lista(0 per terminare): ');
readln(x);
               end;

crea_lista_ordin:=p;
end;

(*Procedura iterativa per la visualizzazione della lista*)
Procedure visualizza_lista(p:puntatore);
begin
 writeln;
 write('punt_lista--> ');

(*Ciclo di scansione della lista*)
while p<>NIL do begin
 write(p^.inf);   //visualizza il campo informazione
 write('---> ');
 p:=p^.pun;       //scorri di un elemento in avanti
 end;
write ('NIL');
end;

(*Main*)
var
 punt_lista:puntatore;   //ci servirà da parametro attuale
begin
punt_lista:=crea_lista_ordin;     //Chiam. dellq funz.per creare la lista
visualizza_lista(punt_lista);     //Chiam. della proc. per visualiz. la lista
readln;

end.