Come ti ho detto, a mio parere devi introdurre una nuova variabile che, ad ogni iterazione del ciclo while, si memorizzi il puntatore all'elemento precedente, cioè quello assunto dalla variabile puntatore ausiliaria prima che questa venga riassegnata al nuovo indirizzo che corrisponde all'elemento successivo.
Quando individuerai l'elemento che deve essere eliminato, avrai a tua disposizione anche l'indirizzo dell'elemento precedente; prima di procedere con la rimozione fisica dell'elemento tramite la procedura Dispose, dovrai aggiornare il campo dell'elemento precedente affinchè punti all'elemento che segue quello che stai per cancellare.
codice:
...
pPrev := nil;
pAus := pLista;
while pAus <> nil do
begin
if pAus^.Inf = Num then
begin
if pPrev <> nil then
pPrev^.Pun := pAus^.Pun
else
pLista := pAus^.Pun;
Dispose(pAus);
pAus := nil;
end
else begin
pPrev := pAus;
pAus := pAus.Pun;
end;
end;
...
Il codice è a puro titolo esemplificativo (non l'ho verificato, ma dovrebbe funzionare).
In particolare, mostra come mantenere il riferimento all'elemento precedentemente puntato e utilizzarlo per correggere i riferimenti degli elementi in fase di eliminazione.
Credo che tu debba anche passare sempre come parametro var il puntatore di inizio della lista poichè nel caso venga eliminato il primo elemento, anche quell'indirizzo deve essere modificato e restituito.
Ciao!