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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 25.11.2015, 16:23   #21
agrestid
Пользователь
 
Регистрация: 11.11.2015
Сообщений: 20
По умолчанию

Как р достигнет нила,если список кольцевой?

При прогоне программы,он сразу из нее выходит,не желая ничего удалять

Последний раз редактировалось agrestid; 25.11.2015 в 16:51.
agrestid вне форума Ответить с цитированием
Старый 25.11.2015, 16:53   #22
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от agrestid Посмотреть сообщение
Как р достигнет нила,ем список кольцевой?
а вот Вы правы!!!
А я нет!
извините, конечно же,
в случае кольцевого списка нужно проверять не nil, а событие, когда указатель укажет на голову!

т.е. попробуйте очистку так:
Код:
// очистка списка с освобождением занятой памяти
procedure Erase;
var
  p,pnext : PP;
begin
  if head=nil then Exit; {список пустой, делать тут нечего}
  p:=head;
  repeat
    pnext := p^.next;
    dispose(p);
    p := pnext;
  until p=head;
  head := nil; {ну и обнулим указатель на список}
end;
p.s. вывод в файл тоже нужно сделать аналогичным циклом!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 25.11.2015, 17:04   #23
agrestid
Пользователь
 
Регистрация: 11.11.2015
Сообщений: 20
По умолчанию

А что будет с указателем,когда мы удалим ячейку памяти,на которую он указывает?

Лемент,на который указывает голова,мы же удалили

Последний раз редактировалось Serge_Bliznykov; 25.11.2015 в 17:22.
agrestid вне форума Ответить с цитированием
Старый 25.11.2015, 17:25   #24
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

ну, от того, что мы удалили элемент, значение указателя, который ссылался на эту область памяти, никак не изменится.
Разумеется, брать значение по ссылке из указателю, после того, как сделали ему dispose - не корректно.
но, если Вы обратите внимание, я для этого и завёл вторую переменную, как раз по этой причине.
мы в неё берём указатель на следующий элемент. освобождаем текущую область памяти и идём дальше.

Короче, Вы проверили код (прошлись в отладчике) и он не работает?
или почему этот вопрос возник?
Serge_Bliznykov вне форума Ответить с цитированием
Старый 25.11.2015, 20:41   #25
agrestid
Пользователь
 
Регистрация: 11.11.2015
Сообщений: 20
По умолчанию

Отлично,всё работает!!
agrestid вне форума Ответить с цитированием
Старый 25.11.2015, 23:07   #26
agrestid
Пользователь
 
Регистрация: 11.11.2015
Сообщений: 20
По умолчанию

Код:
procedure Delete; 
var 
 s, h: PP; 
 Number: integer; 
 Familia: string[20]; 
 last: pp; 
begin 
 Writeln(ToRus('Ââåäèòå êëþ÷è
 ïîèñêà: íîìåð òåë
 åôîíà è ôàìèëèþ')); 
 Readln(Number); 
 Readln(Familia); 
 s := head; 
 h := head; 
 
 while ((s^.dbook.f <> Familia) and (s^.dbook.t <> Number)) or (s^.next <> h) 
 do 
 s := s^.next; 
 
 if s = h then 
 Writeln(ToRus('Íåò ñîâïàäåíèé')) 
 
 else 
 begin 
 
 last := head; 
 while last^.next <> s do 
 last := last^.next; 
 Last := s^.next; 
 dispose(s); 
 end; 
 
end;
Зацикливание в первом вайле
Почему?

Последний раз редактировалось Stilet; 26.11.2015 в 09:43.
agrestid вне форума Ответить с цитированием
Старый 26.11.2015, 00:12   #27
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

зацикливание, потому что логическое условие составлено неверно.
у Вас написано следующее
пока (фамилия не равна) ИЛИ (номер не равен) ИЛИ (следующий элемент не равен голове списка)
выполнять переход на следующий элемент.

очевидно, что если ЛЮБОЕ из условий выполняется, то будет переход.

что это цикл должен найти?
Serge_Bliznykov вне форума Ответить с цитированием
Старый 26.11.2015, 00:26   #28
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

Цитата:
у Вас написано следующее
Не совсем....
Poma][a вне форума Ответить с цитированием
Старый 26.11.2015, 00:32   #29
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от Poma][a Посмотреть сообщение
Не совсем....
мда.. Вы правы.
где мои глаза?!!

там же AND

но суть не меняется.
логика нарушена.

<условие_поиска_не_нашлось> ИЛИ <не последний элемент>

допустим, <<условие_поиска_не_нашлось> выполнилось
первая часть стала FALSE
вопрос - цикл выполнится.
и тут всё зависит от второй части, если нашлось и элемент не последний - то вторая часть условия <не последний элемент> - TRUE
и цикл выполнится дальше.

цикл прервётся ТОЛЬКО в том случае, если требуемые критерии СТРОГО в последнем элементе списка.
тогда оба условия дадут FALSE - и цикл остановится.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 29.11.2015, 12:06   #30
agrestid
Пользователь
 
Регистрация: 11.11.2015
Сообщений: 20
По умолчанию

Почему он не читает из файлов и отказывается туда записывать массив?
Когда прогоняю про брейкпоинту,он просто проскакивает цикл записи в файл и завершает процедуру
Вложения
Тип файла: zip humak_4_25.zip (35.3 Кб, 5 просмотров)
agrestid вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Кольцевой список Good_Luck Помощь студентам 2 29.10.2015 19:08
[РЕШЕНО] Динамический список на Делфи/Паскаль. Требуется консультации Вадим Мошев Помощь студентам 2 18.04.2011 19:37
Кольцевой список counter Общие вопросы C/C++ 4 20.10.2008 08:09