процедура должна удалять отрицательные элементы списка после PP
procedure DelNegative(var PP:TPtr);
Var P:TPtr;
begin
while (PP^.Link<>nil)do
begin
New(P);
P:=PP^.Link;
if P^.Inf<0 then
begin
PP^.Link:=P^.Link;
Dispose(P);
DelNegative(PP);
end
else
begin
PP:=P;
Dispose(P); // <== вот здесь пишет invalid pointer operation
DelNegative(PP);
end;
end;
end;
Опять рекурсия? Убедился, что здесь она не работает? А теперь перепиши это БЕЗ рекурсии, и не теряя указателя на начало списка (как ты делаешь). И больше даже не смотри в сторону рекурсивных процедур. Рано тебе еще туда смотреть.
переписал вот так:
procedure DelNegative(var PP:TPtr);
Var P:TPtr;
begin
New(P);
P:=PP^.Link;
if P^.Inf<0 then PP^.Link:=P^.Link
else PP:=P;
end;
begin
...
while (PP^.Link<>nil)do DelNegative(PP);
...
end;
procedure neg(var pp: TPtr);, смотри внимательно, что и где ты НЕ сделал...
var first, p: tptr;
begin
first := pp;
if first <> nil then
while first^.link <> nil do begin
if first^.link^.inf < 0 then begin
p := first^.link;
first^.link := p^.link;
dispose(p);
end
else first := first^.link;
end;
if (pp <> nil) and (pp^.inf < 0) then begin
first := pp;
pp := pp^.link;
dispose(first);
end;
end;