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

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

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

 
 Ответить  Открыть новую тему 
> однонаправленый список, удалить отрицательные элементы
sheka
сообщение 17.06.2009 16:46
Сообщение #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 
 К началу страницы 
+ Ответить 
volvo
сообщение 17.06.2009 16:59
Сообщение #2


Гость






Опять рекурсия? Убедился, что здесь она не работает? А теперь перепиши это БЕЗ рекурсии, и не теряя указателя на начало списка (как ты делаешь). И больше даже не смотри в сторону рекурсивных процедур. Рано тебе еще туда смотреть.
 К началу страницы 
+ Ответить 
sheka
сообщение 17.06.2009 17:21
Сообщение #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 
 К началу страницы 
+ Ответить 
volvo
сообщение 17.06.2009 18:30
Сообщение #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

 



- Текстовая версия 28.05.2024 9:23
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"