IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

 
 Ответить  Открыть новую тему 
> однонаправленый список, удалить отрицательные элементы
сообщение
Сообщение #1


Я.
****

Группа: Пользователи
Сообщений: 809
Пол: Мужской
Реальное имя: Саша

Репутация: -  11  +


процедура должна удалять отрицательные элементы списка после 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;

помогите решить.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Гость






Опять рекурсия? Убедился, что здесь она не работает? А теперь перепиши это БЕЗ рекурсии, и не теряя указателя на начало списка (как ты делаешь). И больше даже не смотри в сторону рекурсивных процедур. Рано тебе еще туда смотреть.
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Я.
****

Группа: Пользователи
Сообщений: 809
Пол: Мужской
Реальное имя: Саша

Репутация: -  11  +


переписал вот так:

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) *

Опять рекурсия? Убедился, что здесь она не работает?

почему? я уверен что сделал правильно с рекурсией, а где ошибка - понять не могу!

Цитата
и не теряя указателя на начало списка (как ты делаешь).
вообще не понял.. объясни пожалуйста.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Гость






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

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 24.01.2022 13:50
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name