Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
DSD_Spiskovye_struktury_dannykh_na_baze_massivo...doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
2.59 Mб
Скачать

2.1.4Организация списка дыр

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

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

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

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

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

При простой организации списка дыр для связывания дыр в единый список имеет смысл первые 4‑ре байта в каждой из дыр использовать для ссылки на следующий элемент списка дыр NextHole. Последний элемент списка дыр в этом поле будет содержать значение –2. Следует подчеркнуть, что элемент списка при таком решении не может быть меньше 4‑х байт.

№ байта

0  3

4  N

NextHole

остаток дыры

Рисунок 2.4 – Структура дыры, содержащей адрес следующей дыры

Модифицированная организация списка дыр предусматривает построение списка дыр, образующихся как от удаления элементов списка, так и от удаления устаревших массивов указателей на элементы списка. В общем случае размер этих дыр не совпадает. Поэтому в каждой дыре помимо указателя на следующую дыру необходимо содержать размер конкретной дыры. Для этого имеет смысл вторые 4‑ре байта в каждой из дыр – поле размера дыры - SizeHole, использовать для хранения размера дыры или размера свободной части дыры. Следует подчеркнуть, что элемент списка при таком решении не может быть меньше 8‑ми байт.

№ байта

0  3

4  7

8  N

NextHole

SizeHole

остаток дыры

Рисунок 2.5 – Структура дыры, содержащей размер и адрес следующей дыры

Модифицированная организация списка дыр предоставляет возможность объединять смежные дыры в одну дыру большего размера. Это решение приводит к модификации процедуры выбора дыры для нового элемента списка или для нового массивов указателей на элементы списка.

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

Если размер найденной дыры равен запрашиваемому размеру, то дыра изымается из списка дыр и предается в распоряжение списка элементов.

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

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

В приводимой ниже реализации списка на базе массива указателей на элементы списка используется простая организация списка дыр. Однако реализация модифицированной организации списка дыр не представляет особой сложности.

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