Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 21.03.2010, 19:08   #1
08ekhiv1
Пользователь
 
Регистрация: 28.02.2009
Сообщений: 27
Лампочка Линейный однонаправленый список. Удаление элемента.

Привет.

Только начал изучение указателей. Помогите пожайлуста. Правильно ли написана данная процедура удаления элемента в списке. Не остается ли послее ее выполнения занятого участка памяти.

Спасибо!

Код:
procedure Delete(pos:word); //pos позиция элемента поддежащего удалению
var n:word; //счетчик
    PListCur:TPList; //дополнительный указатель
begin
  n:=1;
  PList:=PListBegin; //переводим основной указатель в начало списка
  while n<pos-1 do begin //устанавливаем указатель перед удаляемым элементом
    PList:=PList^.Next;
    inc(n);
  end;
  PListCur:=PList; //ставим дополнительный указатель перед удаляемым элементом
  PList:=PList^.Next; //переводим основной указатель на удаляемый элемент
  PListCur^.Next:=PList^.Next; //соединяем список
  Dispose(PList); //удаляем нужный элемент.
end;
Сомнение у меня вызывает вспомогательный указатель процедуры PListCur. Не оставит ли он после выхода программы из процедуры за сабой висячий адрес, на неиспользуемую память?
08ekhiv1 вне форума Ответить с цитированием
Старый 21.03.2010, 19:43   #2
RUSt88
Участник клуба
 
Регистрация: 29.12.2009
Сообщений: 1,166
По умолчанию

обычно указатели объявляют так
Код:
 PListCur:^TPList;
в конце указателю необходимо по правилам хорошего тона присвоить nil
прогер C\C++\C#\Delphi
ася: [семь 3]-[97]-[1 шесть]
RUSt88 вне форума Ответить с цитированием
Старый 21.03.2010, 21:02   #3
notHaker
Форумчанин
 
Аватар для notHaker
 
Регистрация: 01.12.2009
Сообщений: 569
По умолчанию

Сам по себе адрес - это просто число, оно указывает на данные в памяти (простым языком). Вы выходите из подпрограммы и это число из стека (в нём сохраняются объявленные переменные подпрограммы) удаляется. Удаление данных из памяти -> Dispose.
Код - это работа, а работа стоит денег.

pz-game.ru. 2d зомби-сурвивал для олдфагов.
notHaker вне форума Ответить с цитированием
Старый 22.03.2010, 14:29   #4
08ekhiv1
Пользователь
 
Регистрация: 28.02.2009
Сообщений: 27
По умолчанию

Цитата:
Сообщение от RUSt88 Посмотреть сообщение
в конце указателю необходимо по правилам хорошего тона присвоить nil
Хух спасибо, вроде разобрался.
А как насчёт такого?

Как я понял после команды Dispose() переменная становится неопределенной, а не устанавливается на ноль (nil).

Код:
...
Dispose(Указатель);
Указатель:=nil;
...
Все правильно написано? Или я очистил Указатель а потом занял его место?
08ekhiv1 вне форума Ответить с цитированием
Старый 22.03.2010, 15:52   #5
eoln
Старожил
 
Аватар для eoln
 
Регистрация: 26.04.2008
Сообщений: 2,645
По умолчанию

Указатель - это всего лишь локальная переменная (судя по первому посту) в которой какое-то число (адрес). После dispose(Указатель) мы освободили память по адресу на который указывала переменная, а не саму переменную. Всё, этого вполне достаточно. А переменная сама исчезнет после завершения процедуры.
Указатель:=nil; - это действие с переменной, которая больше не будет использоваться. Это как одноразовая посуда - можно не мыть перед тем как выбросить.
eoln вне форума Ответить с цитированием
Старый 23.03.2010, 10:07   #6
08ekhiv1
Пользователь
 
Регистрация: 28.02.2009
Сообщений: 27
По умолчанию

Цитата:
Сообщение от eoln Посмотреть сообщение
Указатель - это всего лишь локальная переменная (судя по первому посту) в которой какое-то число (адрес). После dispose(Указатель) мы освободили память по адресу на который указывала переменная, а не саму переменную. Всё, этого вполне достаточно. А переменная сама исчезнет после завершения процедуры.
Указатель:=nil; - это действие с переменной, которая больше не будет использоваться. Это как одноразовая посуда - можно не мыть перед тем как выбросить.
Ммм. Спасибо. Вроде понял. Пример с посудой очень кстати )))). Доступно и жизненной.
08ekhiv1 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Однонаправленый список Береза Общие вопросы C/C++ 2 23.05.2009 16:34
Линейный двунаправленный список Seg_62 Паскаль, Turbo Pascal, PascalABC.NET 4 28.08.2008 21:02
Линейный список Black_Ak24 Паскаль, Turbo Pascal, PascalABC.NET 2 04.01.2008 15:00