Опубликован: 26.09.2006 | Доступ: свободный | Студентов: 1811 / 503 | Оценка: 4.25 / 4.12 | Длительность: 17:09:00
ISBN: 978-5-9556-0066-6
Специальности: Программист, Математик
Лекция 2:

Списки

< Лекция 1 || Лекция 2: 123456 || Лекция 3 >

Списки с прямым доступом

Прямой доступ, как правило, реализуется при представлении списка массивом. Элементы кортежа размещаются в идущих подряд ячейках некоторого массива. Для локализации списка в массиве введем целочисленную переменную \first для хранения номера позиции массива, в которой расположен его первый элемент, и целочисленную переменную \length, означающую длину списка. Равенство \length = 0 служит признаком того, что массив содержит пустой список. Иногда для переменных, хранящих позицию элемента массива, удобно иметь какое-либо условное значение, выходящее за рамки индексации массива. Будем обозначать его \beyond.

Рассмотрим подробнее реализацию списка с прямым доступом, дающую возможность добавлять элементы к списку с любого его конца. Воспользуемся циклической "нумерацией" элементов массива, при которой следующим за последним элементом массива считается его первый элемент, а предыдущим для первого — последний (речь идет об элементах массива, а не об элементах списка). Если элементы массива пронумеровать числами от 0 до n-1, то переход к следующему (предыдущему) элементу списка осуществляется с помощью прибавления (вычитания) единицы по модулю n, где nдлина массива. Дескриптор такого списка будет иметь форму

\eq*{
S = [n, \info, \first, \length].
}

Добавление элемента к началу списка осуществляется его записью в позицию \newfirst = (\newfirst - 1) \ {\rm mod} \ n,\ (0 \le \newfirst <
n) с последующим присваиванием \first := \newfirst, а добавление в конец (записью элемента в позицию ( \first + \length) \mod n с последующим выполнением оператора \length := (\length + 1). Заметим, что при таком способе начальный фрагмент кортежа может оказаться в конце массива, а конечный фрагмент — в начале. Заметим также, что добавление нового элемента возможно только при условии \length < n. Кроме того, нужно иметь в виду, что в системах программирования со статическим распределением памяти под массивы, которое происходит во время компиляции, длину массива следует выбирать достаточной для размещения списков, порождаемых разрабатываемым алгоритмом. Следует помнить, что максимальная длина списка зависит не только от алгоритма, но и от входных данных.

Основные отображения для списка с прямым доступом, имеющего дескриптор S = [n, \info, \first, \length], определяются следующим образом:

\Info(pos) = > S.\info [pos],
\Next(pos) = if (pos = S.\first +\, \t{S.}\length-1 )
then pos
else if (S.\length < S.n) then
 (\pos + 1)\ {\rm mod} S.n else \beyond,
\Precede (pos) = if (pos = S. \first) then
pos
else if
(S.>\length < S.n) then (pos - 1) {\rm mod} S.n
else \beyond,
\Last = (S.\first + \t{S.}\length - 1)\ {\rm
mod} S.n,
\Number(pos) = if (S.\first < pos) then
(pos - S.\first + 1)
else (S.pos -
S.\first + \,\t{S.n} - 1).

Приведем несколько процедур для работы со списками с прямым доступом.

Создать пустой список

\formula{\t{procedure}\ {\rm SetEmpty}\t{(S);}\\
\ \t{begin} \\
\t{\rm S.}\first:=0;\\ 
\t{ S.}\length:=0\\ 
\t{end};}

Добавить элемент e к концу списка S

\formula{
\t{procedure AddToEnd (e, S)};\\
\t{begin}\\
\mbox{}\q \t{if}\ {S.}\length < \t{S.n}\\
\mbox{}\q \t{then}\{\t{S.}\info[(\t{S.}\first + \t{S.}\length)\ {\rm
mod}\
\t{S.n}]:= e;\ \t{S.}\length := \t{S.}\length + 1\}\\
\mbox{}\q \t{else 'массив
переполнен'}\\
\t{end};}

Добавить элемент e к началу списка S

\formula{
\t{procedure AddToBegin (e,
S);}\\
\mbox{}\q \t{begin}\\
\mbox{}\qq \t{if}\ \t{S.}\length <
\t{S.n}\\
\mbox{}\qq \t{then}\ \t{\{S.}\first
\!:=\! \t{S.}\first - 1;\
\t{S.}\info[\t{S.}\first] \!:=\! \t{e};\ \t{S.}\length \!:=\! \t{S.}\length +
1\}\\
\mbox{}\q \t{else 'массив
переполнен'}\\
\t{end};}

Заменить элемент с кортежным номером k на элемент e

\formula{
\t{procedure Set (k, e, S);}\\
\t{begin}\\
\mbox{}\q \t{S.}\info \t{[S.}\t{first} + \t{k} - 1] := \t{e}\\
\t{end};}

Удалить последний элемент списка S

\formula{
\t{procedure DelLast (S);}\\
\t{begin} \\
\mbox{}\q \t{if}\ \t{S.}\length >
0\ \t{then}\ \t{S.}\length:=
\t{S.}\length - 1\ \t{else 'список
пуст'}\\
\t{end};}

Удалить первый элемент списка S

\formula{
\t{procedure DelFirst (S);}\\
\t{begin}\\
\mbox{}\q \t{if}\ \t{S.}\length >
0\\
\mbox{}\q \t{then}\ \{\t{S.}\first
:= (\t{S.}\first + 1)\
{\rm mod}\ \t{S.n};\ \t{S.}\length := \t{S.}\length - 1\}\\
\mbox{}\q \t{else 'список пуст'}\\
\t end;
}
< Лекция 1 || Лекция 2: 123456 || Лекция 3 >
Антон Сиротинкин
Антон Сиротинкин

на стр 6, лекции 3, Очевидно "Ck <= модуль(Gk(е))*b(k+1)" (1) - , подскажите что значит "модуль" и почему это очевидно...