Помощь - Поиск - Пользователи - Календарь
Полная версия: однонаправленый список
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
sheka
процедура должна удалять отрицательные элементы списка после 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
Опять рекурсия? Убедился, что здесь она не работает? А теперь перепиши это БЕЗ рекурсии, и не теряя указателя на начало списка (как ты делаешь). И больше даже не смотри в сторону рекурсивных процедур. Рано тебе еще туда смотреть.
sheka
переписал вот так:

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
Цитата
я уверен что сделал правильно с рекурсией
Если б ты сделал правильно - получил бы правильный результат. Я в этом тоже уверен. Вот нерекурсивный вариант:
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;
, смотри внимательно, что и где ты НЕ сделал...
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.