OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Пятница, 19 Апрель, 2024 01:50

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 9 ] 
Автор Сообщение
 Заголовок сообщения: Добавление в конец списка
СообщениеДобавлено: Понедельник, 06 Сентябрь, 2010 21:58 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Что-то давненько не приходилось работать со списком, когда добавлять надо в конец.
Разбаловался системщиной, где один указатель - и добавление в голову :))

Так вот, кажется громоздким IF, проверяющий при добавлении список на непустоту.

Разумно принять, что первый элемент списка - фиктивный, пустой.

Например:

Код:
   TYPE
      Word = POINTER TO RECORD
         next: Word;
         ...
      END;

      WordList = RECORD
         dummy, last: Word
      END;


Тогда при создании списка:
NEW(list.dummy); list.last := list.dummy;
а при добавлении очередного элемента:
list.last.next := new; list.last := new;

Ну а голова списка - list.dummy.next.
Проверка на пустоту: list.last = list.dummy.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Добавление в конец списка
СообщениеДобавлено: Понедельник, 06 Сентябрь, 2010 23:22 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8500
Откуда: Троицк, Москва
В смысле?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Добавление в конец списка
СообщениеДобавлено: Вторник, 07 Сентябрь, 2010 09:15 
Аватара пользователя

Зарегистрирован: Вторник, 19 Сентябрь, 2006 21:54
Сообщения: 2449
Откуда: Россия, Томск
При таком подходе вообще все циклы упрощаются, в которых нужно в произвольное место добавить элемент (т.е. когда не хочется делать различия между добавлением в конец, в середину или в начало). Одно неудобно - если в списке хранятся не сами записи, а их наследники, то приходится приведение типа оборачивать в IF.

Интересно, не появится ли проблем или противоречий, если в языке разрешить следующее присваивание с охраной типа:
dest := source (DestType);
при source = NIL? В таком случае присваивание эквивалентно "dest := NIL", но Оберон выдаёт трап при попытке проверить тип sourcre.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Добавление в конец списка
СообщениеДобавлено: Вторник, 07 Сентябрь, 2010 11:11 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 18:55
Сообщения: 2272
Откуда: Россия, Нижний Новгород
Александр Ильин писал(а):
Интересно, не появится ли проблем или противоречий
Тогда явная проверка на NIL заменится на скрытую от программиста. В Виртовской Школе считается, что компилятор должен выполнять лишь такие действия, которые сам программист сделать не может. Проверить указатель на NIL программист может и сам, если захочет.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Добавление в конец списка
СообщениеДобавлено: Вторник, 07 Сентябрь, 2010 14:50 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Info21 писал(а):
В смысле?


Ну, если у нас список - first и last, то при добавлении:

IF last # NIL THEN
last.next := new; last := new
ELSE
first := new; last := new
END

(На эту громоздкость и Вирт в книге жалуется, типа "удобнее в начало списка").

А если у меня наполнение списка идёт много где - да, например, в цикле - не одного, а нескольких списков.. То этот IF становится поперёк...

Кстати, если список наполняется единожды, а потом передаётся как есть, то передавать стоит просто указатель на элемент. (В моём примере функции у меня возвращают Word, но внутри, в порождающих циклах, работают с WordList).


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Добавление в конец списка
СообщениеДобавлено: Вторник, 07 Сентябрь, 2010 15:57 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8500
Откуда: Троицк, Москва
Используем "барьер" (sentinel) -- и что?
Чётто не понимаю пафоса.
Ну и ладно.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Добавление в конец списка
СообщениеДобавлено: Вторник, 07 Сентябрь, 2010 16:06 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Не, барьер - это в конце, и инициализируемый перед обработкой. А тут - фиктивный элемент в начале, чтобы проверки на NIL избежать. Ну да, полностью аналогично sentinel, но наоборот.

И пафоса нет. Просто поделился нюансом.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Добавление в конец списка
СообщениеДобавлено: Вторник, 07 Сентябрь, 2010 18:15 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8500
Откуда: Троицк, Москва
Илья Ермаков писал(а):
Не, барьер - это в конце
Один хрен.

Пафоса оказалось достаточно, чтобы начать тему.

Просто любопытно.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Добавление в конец списка
СообщениеДобавлено: Вторник, 07 Сентябрь, 2010 19:37 

Зарегистрирован: Суббота, 07 Март, 2009 15:39
Сообщения: 3261
Откуда: Астрахань
Илья Ермаков писал(а):
Что-то давненько не приходилось работать со списком, когда добавлять надо в конец.
Разбаловался системщиной, где один указатель - и добавление в голову :))

Так вот, кажется громоздким IF, проверяющий при добавлении список на непустоту.

Разумно принять, что первый элемент списка - фиктивный, пустой.
Тогда при создании списка:
NEW(list.dummy); list.last := list.dummy;
а при добавлении очередного элемента:
list.last.next := new; list.last := new;

Ну а голова списка - list.dummy.next.
Проверка на пустоту: list.last = list.dummy.

Дык это обычная практика в STL. Я всегда так делаю... :)


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 9 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 5


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
cron
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2024, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB