Суть в принците правильная, но не хватает инициализации Top.
и из-за отсутствия отступов трудно что-либо понять.
type p_subject=^subject;
subject=record
number:longint;
next: p_subject;
end;
var top: p_subject;
run: p_subject;
buf: longint;
i:integer;
begin
{ Не хватало!}
top:=nil;
{!!}
for i:= 1 to 5 do begin
buf:=i;
new(run);
run^.number:=buf;
run^.next:=top;
top:=run;
end;
while run<>nil do begin
writeln(run^.number);
run:=run^.next;
end;
end.