Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учебное пособие(А4).doc
Скачиваний:
8
Добавлен:
01.03.2025
Размер:
3.19 Mб
Скачать

6.2.2 Линейная списковая организация данных

Списковая (цепная) организация данных позволяет связать физически разнесённые в памяти компьютера данные в логическую последовательность (цепочку). Списковая организация — это линейная организация данных, в которой логическая последовательность записей обеспечивается с помощью специальных указателей (адресов связи). Для списковой организации используются понятия — синонимы «строка» и «цепь».

Адресом связи некоторой записи называется атрибут в составе записи, в котором хранится начальный адрес или номер записи, обрабатываемой после этой записи. Например, в адресе связи указывается адрес хранения записи, следующей за данной записью в логической последовательности.

Обычная последовательность обработки записей в списке определяется возрастанием значений ключа в записях.

В записи списка выделяется собственная информация (содержательные сведения) и ассоциативная информация, т.е. адрес связи.

Описание записей списка на языке программирования (например, Паскале) может быть произведено двумя способами:

  1. определение адресов связи как начальных адресов записей;

  2. определение адресов связи как номеров записей.

Второй вариант является более практичным, особенно если требуется хранить список на внешнем запоминающем устройстве.

Возможны два способа организации списка — совместное размещение собственной и ассоциативной информации, когда запись и ее адрес связи образуют одно целое (рис. 6.2, а), и раздельное, когда имеется списковая организация адресов связи и последовательное хранение собственной информации (рис. 6.2, б).

а

б

Рис. 6.2 — Варианты списковой организации данных:

а — совместное хранение записей и адресов связи; б — раздельное хранение ассоциативной и собственной информации

С

овместное размещение собственной и ассоциативной информации (адреса связи), когда запись и её адрес связи располагаются в памяти вплотную.

Раздельное размещение собственной и ассоциативной информации. При таком размещении ассоциативная информация, относящаяся к каждой записи, образует звено связи.

а)

На графических иллюстрациях прямоугольником со стрелкой изображается адрес связи. Стрелка указывает на элемент данных, адрес хранения которого содержится в адресе связи.

Раздельное размещение собственной и ассоциативной информации оправдано, если имеется возможность разделить звенья связи в различных участках памяти, отличающихся по быстродействию и скорости обмена.

Адрес связи, отмечающий первую обрабатываемую запись, называется указателем списка (УС).

Список начинается с указателя списка.

Основные возможности списковой организации данных обеспечивает однонаправленный список, в котором реализуется взаимосвязь между записями типа «следующий».

Каждая запись имеет адрес связи, содержащий адрес расположения следующей записи. Если следующая запись отсутствует, то вместо адреса связи в указатель помещается специальный знак, который называется признаком конца записи и условно обозначается КС или . На графических иллюстрациях адрес связи, соответствующий концу строки, перечеркивается. Однонаправленный список с последовательностью записей a, b, c показан на рис. 6.2.

Рассмотрим последовательность записей с ключами 21, 59, 65, 49, 29, 61, 31, 62, 25, 59. Построим линейный однонаправленный список для следующих значений записей и произведем их корректировку (включение записи со значением 80 и удаление записи со значением 25). Удаление записи произведем без учета новой вставленной записи.

Структуру записей, соединенных в цепь, иллюстрирует рис. 6.3.

Рис. 6.3 — Формирование упорядоченного списка

из неупорядоченных записей

При поступлении новой записи (например, с ключом 80) она устанавливается на свободное место (условно в конец линейной цепочки), находится ее место среди адресов связи в списке и производится перезапись адресов связи с целью условного включения ее в цепочку (рис. 6.4).

Рис. 6.4 — Линейная списковая организация данных

с добавлением новой записи со значением 80

При включении новой записи в цепочку фактически меняется только один адрес связи у предыдущей записи по отношению к вставляемой. Например, для новой записи со значением 80 в цепочке записей ищем предыдущую (запись со значением 65) и последующую (конец списка — ) записи. Новая запись условно (т.е. меняются только адреса связи) должна разместиться между этими записями. Как видно из рис. 6.4, адрес связи записи со значением 65 теперь направлен на запись со значением 80. Адрес связи записи со значением 80 стал концом списка .

При удалении записи (например, с ключом 25) находится ее место среди адресов связи в списке и производится перезапись адресов связи с целью исключения ее из исходной цепочки (рис. 6.5).

Рис. 6.5 — Линейная списковая организация данных после

удаления записи со значением 25

При удалении записи из цепочки фактически также меняется только один адрес связи у предыдущей записи по отношению к удаляемой. Например, при удалении записи со значением 25 в цепочке записей ищем предыдущую (запись со значением 21) и последующую (запись со значением 29) записи по отношению к удаляемой. Удаляемая запись условно размещалась между этими записями. Как видно из рис. 6.5, адрес связи предыдущей записи со значением 21 теперь направлен на последующую запись со значением 29.

При формировании упорядоченного списка записей возможны два варианта:

  1. вновь поступающие записи вставлять так, чтобы не нарушать упорядоченность по ключу;

  2. создать сначала неупорядоченный список, а затем упорядочить его.

Учитывая, что для сортировки можно использовать метод слияния, второй вариант следует признать более целесообразным.

Для поиска в упорядоченном списке можно использовать те же методы, что и в последовательном массиве, однако эффективность этих методов иная, поскольку адреса связи создают возможность быстрого доступа только к следующей записи списка.

Для поиска данных в однонаправленном списке используется единственный метод — последовательный поиск. Ключевой атрибут первой записи (ее адрес извлекается из указателя списка) сравнивается с искомым значением q, затем такое же сравнение выполняется для ключа второй записи, которая извлекается по адресу связи первой записи, и т.д.

Неэффективность бинарного поиска для списковой организации данных объясняется тем, что для достижения середины интервала требуется последовательное движение в соответствии с адресами связи, и суммарное количество переходов от записи к записи достаточно велико. Число переходов от записи к записи при доступе к серединам интервалов представляется величиной М/2 + М/4 + М/8 +..., что практически составляет М.

Для ускорения доступа к списку используются двунаправленный (рис. 6.6) и кольцевой списки (рис. 6.7).

Рис. 6.6 — Организация двунаправленного списка

Двунаправленный список рассчитан на обработку записей в двух направлениях: прямом и обратном. Список образован двумя цепочками адресов связи — от первой записи к последней и от последней записи к первой.

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

Рис. 6.7 — Организация кольцевого списка

Кольцевой список получается из однонаправленного заменой признака конца списка на адрес связи с первой записью списка.

В кольцевом списке последний адрес связи указывает на первую запись. Зная одну из записей списка, можно быстро извлечь все его записи.

Списковая организация данных эффективна и удобна, так как не требует перезаписи поступающих данных.

Недостаток списковой организации данных — это замедление поиска по сравнению с массивом за счёт работы с адресами.

Для обработки данных все записи снабжаются адресами связи, с помощью их определяется цепочка записей, в которой значения ключевых атрибутов возрастают.

Цепным каталогом называется сплошной участок памяти (или несколько таких участков), в котором одновременно размещаются список обрабатываемых записей и список свободных позиций памяти. Адрес связи, отмечающий первую свободную позицию памяти, называется указателем свободной памяти (УСП). Адрес связи последней записи (или последней позиции свободной памяти) в списке называется концом списка и отмечается нулевым значением.

Рассмотрим пример цепного каталога, в котором адреса связи представлены номерами соответствующих записей.

Первоначальное состояние каталога показано в таблице 6.1 (а).

Включение и исключение записей в цепном каталоге предполагает поиск местоположения включаемой (исключаемой) записи и замену значений адресов связи для установления новой последовательности записей основного списка и списка свободной памяти.

Таблица 6.1 — Операция вставки записи с ключом 60 в цепной каталог

Алгоритм вставки записи с ключом F в цепной каталог (таблица 6.1, F = 60) следующий:

  1. найти в каталоге запись с ключом непосредственно меньше, чем F (предшествующая запись);

  2. поместить запись с ключом F в первую позицию свободной памяти;

  3. заменить указатель свободной памяти на адрес связи новой записи, этот адрес связи — на адрес связи предшествующей записи, а последний — на первоначальное значение УСП.

Приведем алгоритм удаления записи с ключом F из каталога (таблица 6.2, F = 35):

  1. найти в каталоге записи с ключом непосредственно меньше, чем F (предшествующая запись со значением 23), и непосредственно больше (последующая запись со значением 45);

  2. заменить адрес связи предшествующей записи на адрес связи последующей записи, т.е. адрес связи записи со значением 23 будет направлен на запись со значением 45;

  3. заменить УСП на адрес исключаемой записи, а адрес связи исключаемой записи — на первоначальное значение УСП.

Таблица 6.2 — Операция удаления записи с ключом 35 в цепном каталоге

Время корректировки складывается из времени реализации поиска и времени на замену значений адресов связи.

В последнем случае число пересылок адресов связи всегда одинаково и не зависит от числа записей в цепном каталоге, поэтому затраты времени на поиск при корректировке являются доминирующими и время корректировки Т пропорционально числу записей М.