Опубликован: 26.09.2006 | Уровень: специалист | Доступ: платный
Лекция 2:

Списки

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

Списки с последовательным доступом

Последовательный доступ к элементам списка, как правило, реализуется с использованием динамического выделения памяти во время исполнения программы. Поиск свободных участков памяти обычно возлагается на систему программирования. Мы будем называть такие списки связными. Преимущества связных списков перед списками с прямым доступом проявляются в тех случаях, когда часто используются вставки в списки и удаление элементов из списков. Еще одно преимущество динамического выделения памяти может проявиться, когда в алгоритме одновременно используется большое количество списков, каждый из которых в процессе работы может потребовать большой объем памяти, однако в совокупности эта память может быть ограничена приемлемой величиной.

Элементы связного списка, следующие друг за другом, не обязательно размещаются в последовательных ячейках памяти — доступ к следующему и предыдущему элементам осуществляется при помощи специальных ссылок (указателей). Чтобы обеспечить запоминание указателей на следующий и предыдущий элементы, каждый элемент списка "погружается" в узел, для которого в памяти компьютера формируется запись, состоящая из нескольких полей. В простейшем случае эта запись может состоять из двух полей. Одно из них — \Info — предназначено для запоминания самого элемента, а другое — \Next — для запоминания позиции следующего. Для обозначения такого узла будем использовать следующую форму:

\eq*{
t: [\Info, \Next],
}
где t — позиция (адрес) узла в памяти. Поскольку у последнего элемента нет следующего, его поле \Next заполняют значением \rm nil. Иногда вместо \rm nil используют ссылку на сам этот элемент, что также может являться признаком конца списка. Мы часто будем пользоваться именно этим способом распознавания конца списка. Представление списка с помощью таких узлов обеспечивает сканирование списка от начала к его концу. Доступ к самому списку осуществляется через его голову с помощью переменной \first, содержащей позицию первого элемента. Такие списки называются односторонними.

При описании операций со списками через t\t{\^{}} будем обозначать узел, расположенный в позиции t. Для доступа к полям узла t\t{\^{}} используем форму t\t{\^{}}.\Info, t\t{\^{}}.\Next и т.д. Оператор для создания нового узла будем записывать в виде

\eq*{
\Create (t: [\Info, \Next]).
}

Для обеспечения сканирования как от начала к концу, так и от конца к началу используют узлы следующего вида:

\eq*{
t: [\Info, \Next, \Precede].
}

Поле t\t{\^{}}.\Precede служит для запоминания позиции элемента, предшествующего элементу, находящемуся в позиции t. Доступ к такому списку может осуществляться как через его начало с помощью переменной \first, так и через конец с помощью переменной {\rm
last}. Такие списки называются двусторонними.

На рис. 2.1—2.6 представлено несколько разновидностей списков. Узлы списков изображены прямоугольниками, разделенными на части по числу полей. Стрелки проведены в соответствии со значениями полей \Next и \Precede.

Односторонний список: вход через первый элемент, сканирование от начала к концу, признак конца — Next(pos) = nil

Рис. 2.1. Односторонний список: вход через первый элемент, сканирование от начала к концу, признак конца — Next(pos) = nil
Односторонний список: вход через первый элемент; сканирование от начала к концу, признак конца — Next(pos) = pos

Рис. 2.2. Односторонний список: вход через первый элемент; сканирование от начала к концу, признак конца — Next(pos) = pos
Односторонний циклический список: вход через первый элемент; сканирование от начала к концу, признак конца — Next(pos) = first

Рис. 2.3. Односторонний циклический список: вход через первый элемент; сканирование от начала к концу, признак конца — Next(pos) = first
Односторонний циклический список: вход через последний элемент с помощью ссылки Last^.next; сканирование от начала к концу, признак конца — pos = last

Рис. 2.4. Односторонний циклический список: вход через последний элемент с помощью ссылки Last^.next; сканирование от начала к концу, признак конца — pos = last
Двусторонний список: вход через первый элемент, сканирование от начала к концу и от конца к началу; признак начала — Procede(pos) = nil; признак конца — Next(pos) = nil

Рис. 2.5. Двусторонний список: вход через первый элемент, сканирование от начала к концу и от конца к началу; признак начала — Procede(pos) = nil; признак конца — Next(pos) = nil
Двусторонний циклический список: вход через первый элемент; сканирование от начала к концу и от конца к началу, признак конца — Next(pos) = first

Рис. 2.6. Двусторонний циклический список: вход через первый элемент; сканирование от начала к концу и от конца к началу, признак конца — Next(pos) = first
< Лекция 1 || Лекция 2: 123456 || Лекция 3 >
Антон Сиротинкин
Антон Сиротинкин

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

Дмитрий Степаненко
Дмитрий Степаненко
Россия
Эдуард Санин
Эдуард Санин
Украина, Харьков, ХАИ