Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
выш.мат. методичка.DOC
Скачиваний:
32
Добавлен:
13.02.2015
Размер:
1.71 Mб
Скачать

7.3. Работа со структурами данных

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

• информационную часть - та часть/которая содержит всю информацию о том или ином объекте (например если это структура целых чисел, то значение конкретного числа);

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

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

Пример. Тип элемента структуры, содержащего символьную информацию в виде строки,

tyре

рРоint =^Е1еm, {указатель на элемент}

Е1em = rесоrd

Info: string[80];

Рoint: pPoint {тип элемента структуры}

end;

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

  • добавление элемента структуры;

  • исключение элемента структуры;

  • поиск элементов структуры по какому-то признаку.

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

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

tуре рРоint= ^Е1еm;

Еlem = rесоrd

Info: Integer;

Роint: рРоint

end;

Для работы с очередью введем следующие переменные:

var

Ро, РоB, РоE: рРоint;

X: Integer;

Предположим, что вначале в очереди нет элементов - очередь пуста. Этот факт можно зафиксировать следующим образом:

PoB:=nil; PoE:=nil; а) нет элементов б) добавление первого элемента в) добавление второго элемента г) удаление первого элемента

Введем в очередь первый элемент. Для этого можно выполнить следующие действия:

Read(Х); {чтение значения первого элемента}

New(Po); {выделение области под элемент}

Ро^.Info:=X; {информационная часть}

Рo^.Рoint:=nil; {нет следующего элемента}

РоВ := Ро; {указатель начала очереди}

РоE := Ро; {указатель конца очереди}

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

Read(Х);

New(Ро);

Ро^.Info := X;

Ро^.Роint := nil;

РоЕ^.Роint := Ро; {установление связей}

РоЕ := Ро;

Полученная ситуация соответствует в)

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

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

if Pon<>nil then

begin

Ро := РоВ^.Роint; {указатель на второй элемент}

Dispose(РоВ); {освобождение области}

РоВ := Рo;

end;

Полученная ситуация соответствует г).

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