1. Заголовок темы должен быть информативным. В противном случае тема удаляется ... 2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения. 3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали! 4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора). 5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM! 6. Одна тема - один вопрос (задача) 7.Проверяйте программы перед тем, как разместить их на форуме!!! 8.Спрашивайте и отвечайте четко и по существу!!!
однонаправленый список, удалить отрицательные элементы
процедура должна удалять отрицательные элементы списка после 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;
хотя и работает отлично, мне этот вариант не очень нравится, потому что есть объявление New(P); а dispose(P); - нет (я так понимаю все нормально из-за того, что Р - локальная переменная).
Цитата(volvo @ 17.06.2009 16:59)
Опять рекурсия? Убедился, что здесь она не работает?
почему? я уверен что сделал правильно с рекурсией, а где ошибка - понять не могу!
Цитата
и не теряя указателя на начало списка (как ты делаешь).
Если б ты сделал правильно - получил бы правильный результат. Я в этом тоже уверен. Вот нерекурсивный вариант:
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;