процедура должна удалять отрицательные элементы списка после 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;
помогите решить.
volvo
17.06.2009 20:59
Опять рекурсия? Убедился, что здесь она не работает? А теперь перепиши это БЕЗ рекурсии, и не теряя указателя на начало списка (как ты делаешь). И больше даже не смотри в сторону рекурсивных процедур. Рано тебе еще туда смотреть.
sheka
17.06.2009 21:21
переписал вот так:
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;
хотя и работает отлично, мне этот вариант не очень нравится, потому что есть объявление New(P); а dispose(P); - нет (я так понимаю все нормально из-за того, что Р - локальная переменная).
Цитата(volvo @ 17.06.2009 16:59)
Опять рекурсия? Убедился, что здесь она не работает?
почему? я уверен что сделал правильно с рекурсией, а где ошибка - понять не могу!
Цитата
и не теряя указателя на начало списка (как ты делаешь).
вообще не понял.. объясни пожалуйста.
volvo
17.06.2009 22:30
Цитата
я уверен что сделал правильно с рекурсией
Если б ты сделал правильно - получил бы правильный результат. Я в этом тоже уверен. Вот нерекурсивный вариант:
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;
, смотри внимательно, что и где ты НЕ сделал...
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.