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

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

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). Если закомментарить эту строчку, то программа все выполняет без проблем, но отрицательные элементы получается удаляются только логически, а память не освобождается. как предотвратить это. А то предстоит еще делать более сложные вещи со списками=) smile.gif

P.S. думаю что тема-вопрос про такого рода задания уже была, но меня интересует именно почему удаление из памяти не делается. Буду благодарен если мне кто нибудь поможет найти причину) yes2.gif

Вот код программы
Код
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
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Altair
сообщение 24.03.2006 19:03
Сообщение #2


Ищущий истину
******

Группа: Модераторы
Сообщений: 4 824
Пол: Мужской
Реальное имя: Олег

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


У нас в FAQ'e есть все необходимое для построения программ, работающих с ДСД, в том числе со стеками.
FAQ -> ДСД-> Стеки

Обрати внимание (смотри тему Списки), что при удалении элемента, сначала создается указатель с ссылкой на удаляемый элемент.
Procedure Del (Var q: point);
Var r: point;
Begin
r:=q^.Next;
q^.Next:=q^.Next^.next;
r^.Next:=nil
End;


--------------------
Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
mr.
сообщение 26.03.2006 20:10
Сообщение #3





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

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


да я все нашел. просто надо было указатель удаляемого элемента сделать nil и все работает. но все равно спасибо)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

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

 



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