Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
SAOD..doc
Скачиваний:
142
Добавлен:
11.05.2015
Размер:
959.49 Кб
Скачать

4.2 Представление полустатических структур с помощью массивов

Представление стека

Типичное представление стека – массивом, содержащим не меньшее число элементов, чем может быть за­слано в стек.

Для очередного элемента достаточно иметь один указатель t на этот элемент. Когда стек пуст, t = 0.

Описание:

const ms = 100;

var stack : array[1..ms] of tt; t : integer;

Чтобы добавить элемент в стек, нужно увеличить значение указателя на единицу, а затем занести в эле­мент массива с индексом t информацию из y :

t := t + 1;

stack[t] := y;

Удаление элемента из стека

y := stack[t];

t := t - 1;

При этом следует помнить, что t не может быть меньше 1 и больше MS. Следовательно, нужны проверки на пустоту и переполнение стека. If t = 0 then { }

else begin y := stack[t]; t := t - 1 end; if t = ms then { }

else begin t := t + 1; stack[t] := y end;

Представление очереди

Очередь также может быть представлена массивом, но для неё уже нужны два указателя: f – для начала и r – для конца очереди. Описание: const mq = 100; var queue : array[1..mq] of tt; var f, r : integer;

Включение в очередь производится так же, как и в стек: queue[r] := y; r := r + 1; При этом r может только расти. Исключение из очереди делается аналогично: y := queue[f]; f := f + 1; Текущая длина очереди равна r - f .

Для устранения сползания очередь замыкают в кольцо. В кольцевой очереди после queue[mq] логически следует queue[1] .Но при этом если r=f , то очередь может быть либо заполнена до конца, либо пуста. Для того, чтобы избежать неоднозначности, последний элемент не заполняют и это обстоятельство считается переполне­нием.

Добавление в кольцевую очередь: if r = mq then r := 1

else r := r + 1; if r = f then { }

else queue[r] := y; Исключение элемента из кольцевой очереди: if r = f then { }

else begin y := queue[r];

if f = mq then f := 1 else f := f + 1;

end; Определение числа элементов в очереди: if r < f then k := mq + r - f

else k := r - f

Контрольные вопросы

Полустатические структуры. Понятие списка.

Стек как структура данных.

Очередь и дек как структуры данных.

Представление полустатических структур с помощью массивов.

5 Линейные динамические структуры

5.1 Основные свойства динамических структур

В отличие от статических и полустатических структур динамические структуры обладают следующими свойствами:

  • непостоянством и непредсказуемостью размера (числа элементов) структуры в процессе её обработки. Размер динамической структуры может изменяться от 0 до некоторого значения, определяемого спецификой задачи или доступным объемом машинной памяти;

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

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

С другой стороны, такая схема является более гибкой и часто обеспечивает выигрыш в памяти.

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

Начало

3

1

И

1 2 1 13 I—14

5

4

0

5

1

Рис 11

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

Простейшие связные списки – односвязный (один указатель), двусвязные (два).

В принципе может быть и больше указателей.

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

Содержательное поле хранит данные (в общем случае это запись).

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

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

Сравнивая между собой две рассмотренных формы хранения информации в памяти ЭВМ (в виде последо­вательных и связанных списков), можно отметить:

  1. связанные списки требуют дополнительной памяти для хранения связей. Иногда это важно. Однако часто бывает так, что свободное место для поля связи уже есть в элементе, если он не занимает весь слот цели­ком. Кроме того, во многих применениях несколько элементов можно объединить в один узел и тогда на них потребуется только одна связь. Гораздо важнее тот неявный выигрыш в памяти, который возникает при ис­пользовании связных списков, поскольку позволяет совмещать общие части таблиц;

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

  3. легко включить элемент в связный список в любое место. Все также сводится лишь к изменению свя­зей. (Для последовательных списков нужно перемещать часть списка);

  4. доступ к k-му элементу связного списка возможен только с начала списка и после просмотра предыду­щих элементов. (Это – плата за их разброс.);

  5. легко осуществляется слияние двух связных списков или разбиение одного списка на части;

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

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

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

Между элементами одного списка в памяти могут находиться элементы других списков.

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

  • код списка;

  • имя списка;

  • адрес (указатель) начала списка;

  • текущее число элементов в списке;

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

для него выделяется какое-либо другое место в памяти.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]