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

3.4. Управление памятью при статической реализации списков

Реализация списков на основе массивов с указателями-индексами требует постоянного отслеживания свободных и занятых ячеек массива. Можно предложить два подхода.

Первый - более простой, но менее эффективный: все свободные ячейки в связующей части содержат какой-либо специальный номер, например – число ( -1). Тогда при начальном создании пустого списка во все ячейки (кроме нулевой с заголовком) в связующие части помещается значение ( -1). Если при удалении элемента из списка соответствующая ячейка должна стать свободной, то в ее связующую часть записывается значение ( -1), что возвращает эту ячейку в набор свободных. При добавлении нового элемента поиск свободной ячейки организуется просмотром всего массива до обнаружения первой ячейки со значением ( -1). Именно эта операция в некоторых случаях может приводить к росту вычислительных затрат, если случайно все свободные ячейки оказались в конце массива, а сам массив является достаточно большим (например, содержит сотни тысяч ячеек).

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

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

for i := 1 to N-1 do StatList [ i ]. Next := i + 1;

StatList [ N ]. Next := 0;

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

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

Состояние пустого списка:StartFree = 1

0

1

2

3

4

5

6

7

8

9

10

0

2

3

4

5

6

7

8

9

10

0

Состояние списка с шестью элементами:

  • Занятые ячейки массива: 3 – 1 – 2 – 8 – 10 – 5

  • Свободные ячейки: 6 – 9 – 4 – 7 ,StartFree = 6

0

1

2

3

4

5

6

7

8

9

10

Инф.2

Инф.3

Инф.1

Инф.6

Инф.4

Инф.5

3

2

8

1

7

0

9

0

10

4

5

Состояние списка со всеми десятью элементами:

  • Занятые ячейки: 8 – 2 – 5 – 6 – 7 – 10 – 1 – 4 – 3 – 9

  • Свободных ячеек нет: StartFree = -1

0

1

2

3

4

5

6

7

8

9

10

Инф.7

Инф.2

Инф.9

Инф.8

Инф.3

Инф.4

Инф.5

Инф.1

Инф.10

Инф.6

8

4

5

9

3

6

7

10

2

0

1