Если количество элементов в списке постоянно, то в зависимости от их
типа список вырождается в вектор, массив, структуру или таблицу. Отличие
списка
от этих структур данных — в длине. Для списков она является
переменной. Поэтому программист, разбираясь с самими списками, должен
уделить внимание тому, каким образом ему следует выделять память для
хранения списка. Обычно языки высокого уровня имеют соответствующие
средства в отличие от языка ассемблера. При написании программы на
ассемблере программист должен уметь напрямую обратиться к операционной
системе для решения проблемы динамического управления памятью. В
примерах мы будем использовать соответствующие функции API Win32 как
более современные, хотя для общего случая это не принципиально. В MS DOS
имеются аналогичные функции (с точки зрения цели использования) — это
функции 48h, 49h, 4ah прерывания 21h. Вопрос динамического управления
памятью в силу своей важности в контексте настоящего рассмотрения
требует особого внимания.
Отличие последовательных списков от связных состоит в том, что
добавление и удаление элементов возможно только по концам структуры. В
зависимости от алгоритма изменения различают такие виды последовательных
списков, как стеки, очереди и деки. Эти виды списков обычно дополняются
служебным дескриптором, который может содержать указатели на начало и
конец области памяти, выделенной для списка, указатель на текущий
элемент.
Зачем нужен, к примеру, стек? Необходимость использования своего
стека в программе вполне вероятна, хотя бы исходя из того, что
элементы, для хранения которых он создается, могут иметь размер,
отличный от 2/4 байта.
Важно понимать, что внутренняя структура элемента практически не
зависит от типа последовательного списка. Списки отличает набор
операций, которые производятся над ними. Поэтому рассмотрим их отдельно
для каждого типа последовательного списка.