Проблема с удалением элемента списка из памяти |
1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!
Проблема с удалением элемента списка из памяти |
mr. |
24.03.2006 14:31
Сообщение
#1
|
Группа: Пользователи Сообщений: 5 Пол: Мужской Реальное имя: Антон Репутация: 0 |
Программа, создающая список типа "стэк", создающая элементы списка равные по модулю отрицательным после них, а затем удаляющая сами отрицательные элементы. Проблема состоит в том что процедура DeleteNeg, "стопорится", если указываешь ей удалять элемент списка из памяти Dispose(Del). Если закомментарить эту строчку, то программа все выполняет без проблем, но отрицательные элементы получается удаляются только логически, а память не освобождается. как предотвратить это. А то предстоит еще делать более сложные вещи со списками=)
P.S. думаю что тема-вопрос про такого рода задания уже была, но меня интересует именно почему удаление из памяти не делается. Буду благодарен если мне кто нибудь поможет найти причину) Вот код программы Код program hw_1; uses crt; type PItem=^TItem; TItem=record Data:integer; Prev:PItem; end; var P:PItem; Head:PItem; fl:text; procedure CreateSame; var Pnew:PItem; Curr:PItem; begin Curr:=Head; while Curr<>nil do begin if Curr^.Data<0 then begin new(Pnew); Pnew^.Prev:=Curr^.Prev; Pnew^.Data:=Abs(Curr^.Data); Curr^.Prev:=Pnew; end; Curr:=Curr^.Prev; end; end; procedure DeleteNeg; var Del:PItem; Save:PItem; Curr:PItem; begin Curr:=Head; While (Head^.Data<0) and (Head<>nil) do begin Curr:=Head; Head:=Head^.Prev; Dispose(Curr); end; Save:=Head; Curr:=Head^.Prev; while Curr<>nil do begin if Curr^.Data>0 then Save:=Curr else begin Save^.Prev:=Curr^.Prev; Del:=Curr; {Dispose(Del);} end; Curr:=Curr^.Prev; end; end; procedure ShowList; var Curr:PItem; begin TextColor(15); Curr:=Head; while Curr<>nil do begin write(Curr^.Data,' '); Curr:=Curr^.Prev; end; end; procedure CheckList; begin CreateSame; writeln; Textcolor(5); writeln('‘®§¤ л а ўлҐ Ї® ¬®¤г«о ®ваЁж ⥫мл¬'); ShowList; DeleteNeg; end; procedure MakeList; begin Head:=nil; While not (EOF(fl)) do begin new(P); readln(fl,P^.Data); if Head<>nil then P^.Prev:=Head else P^.Prev:=nil; Head:=P; end;{while} end; Begin ClrScr; Assign(fl,'HW_1.txt'); {$I-} reset(fl); {$I+} if IOResult=0 then begin MakeList; TextColor(5); writeln('?бе®¤л© бЇЁб®Є'); ShowList; CheckList; end else writeln('ЋиЁЎЄ ®вЄалвЁп д ©« '); writeln; TextColor(5); writeln('ЏаҐ®Ўа §®ў л© бЇЁб®Є'); ShowList; readln; readln; end. вот еще прикрепил файл с этой программой. Сообщение отредактировано: mr. - 24.03.2006 14:33 Прикрепленные файлы SPISOK.PAS ( 1.71 килобайт ) Кол-во скачиваний: 155 |
Altair |
24.03.2006 19:03
Сообщение
#2
|
Ищущий истину Группа: Модераторы Сообщений: 4 824 Пол: Мужской Реальное имя: Олег Репутация: 45 |
У нас в FAQ'e есть все необходимое для построения программ, работающих с ДСД, в том числе со стеками.
FAQ -> ДСД-> Стеки Обрати внимание (смотри тему Списки), что при удалении элемента, сначала создается указатель с ссылкой на удаляемый элемент. Procedure Del (Var q: point); -------------------- Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С) |
mr. |
26.03.2006 20:10
Сообщение
#3
|
Группа: Пользователи Сообщений: 5 Пол: Мужской Реальное имя: Антон Репутация: 0 |
да я все нашел. просто надо было указатель удаляемого элемента сделать nil и все работает. но все равно спасибо)
|
Текстовая версия | 13.05.2024 19:53 |