| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
УКАЗАТЕЛИ И ДИНАМИЧЕСКИЕ СТРУКТУРЫ ДАННЫХ.5. Динамические структуры данных.Указатели являются эффективным средством построения динамических структур данных в виде различных списков. Списком называется структура данных, каждый элемент которой содержит ссылку, связывающую его со следующим элементом. 5.1. Динамические переменные и структуры связанных данных.Управление памятью, занятой ссылочной переменной P^, должно осуществляться new(P) и dispose(P) динамически. Назовем управляемую таким образом область памяти динамической памятью или "кучей". В начале программы следует установить указатель динамической области на ее начало, которое при каждом new(P) сдвигается соответственно потребности в памяти для P^. Для dispose(P) соответствующее место в памяти объявляется свободным, так что динамическая область может иметь "пропуски", которые заполняются при следующих вызовах процедуры new(P). С помощью следующей программы можно проверить, сколько памяти можно
отвести в Вашем компьютере под динамическую память. Переменные типа "указатель" служат прежде всего для того, чтобы создавать структуры связанных данных (связанные списки и деревья), где элемент вызывается с помощью указателя на предшественник или последователь такого элемента. Каждый элемент связанного списка является записью, состоящей из двух частей: данные и указатель на следующий элемент списка. Конец списка помечается указателем nil. Начало списка формирует переменная типа "указатель", содержащая первый элемент списка. С точки зрения техники программирования, список характеризуется только переменной типа "указатель", заголовком списка, являющейся указателем на первый элемент списка. Следующая программа демонстрирует создание и печать одного такого
списка. Для организации списков используются записи, состоящие из двух частей. Первая часть содержит подлежащую обработке информацию, во второй части находится указатель на следующую запись списка. Рассмотрим наиболее распространенные типы списков - стеки и очереди. 5.2. Стек. Стек - это список с одной точкой доступа к его элементам. Механизм
работы стека таков:
Здесь Элемент стека описывается следующим образом: Здесь Stack - имя типа, которое определяет переменную-указатель. Этот указатель будет содержать значение адресов оперативной памяти, по которым будут размещаться переменные типа record (S). Элемент стека содержит два поля. Первое поле (I) составляет информационную часть записи, второе поле (P) - указатель на другую переменную типа S. Формирование стека реализуется следующей процедурой: В основной программе указателю T присваивается значение Nil (Nil - специальное значение указателя, которое означает, что он не содержит никакого адреса). Это необходимо для формирования первой компоненты стека. Первый оператор процедуры резервирует память под первую компоненту стека, т.е. указатель W получает конкретное значение. Далее формируется первый элемент стека (информационная часть записи и указатель на предыдущую запись). Поскольку T := Nil, то первая компонента стека не имеет ссылки на какую-либо другую компоненту стека. Далее T := W, т.е. при следующем обращении к процедуре PomVStack новая компонента стека будет содержать ссылку на первый элемент стека и т.д. Извлечение элементов из стека может быть осуществлено с помощью
следующей процедуры: 5.3. Алгоритм составления связанных списков. Алгоритм составления связанных списков разберем на примере программы,
иллюстрирующей работу стека. Структурами связанных данных являются упорядоченные двоичные деревья. Дерево состоит из узлов и ветвей, за которыми вновь следуют узлы. Узлы, в которые не входит никаких ветвей, называются корневыми. Узлы, из которых не выходит ветвей, называют листьями. Тем самым можно строить иерархические отношения. Каждый узел вновь состоит из части, содержащей данные, и указателя, показывающего на следующий узел (т.е. на ветви). Если каждый узел имеет самое большее по две ветви, говорят о бинарном
или двоичном дереве. Тогда каждый узел имеет одного левого и одного правого
последователя. Подобное дерево можно было бы описать, например, таким
образом: Если кроме того для каждого узла выполняется правило, что все левые примыкающие к этому узлу узлы меньше (т.е. имеют меньший ключ), а все правые узлы больше, то такое бинарное дерево называют упорядоченным. В силу своего свойства упорядоченности применение подобных деревьев для поиска исключительно удобно. Их можно назвать деревьями поиска или поисковыми деревьями. 5.4. Упорядоченное двоичное дерево. Существует три способа просмотра всех узлов двоичного дерева. Следует
начинать от корня рекурсивно для каждого узла. При этом можно, конечно, поменять местами правую и левую части. При просмотре упорядоченного двоичного дерева согласно inorder получаются узлы в отсортированной последовательности (узлы слева направо увеличиваются, а справа налево уменьшаются). В следующем примере строится и выводится на печать упорядоченное
бинарное дерево. Функция Einfuegen() добавляет такой узел в дерево. Добавление
управляется через ключи: если текущее значение меньше значения ключа
рассматриваемого в настоящий момент узла дерева, новый узел будет относится к
левому поддереву, в противном случае - к правому. В конце выполнения процедуры
Einfuegen() новый узел добавляется в дерево в качестве листа. 5.5. Очередь.Очередь - это список, в котором извлечение элементов происходит из начала цепочки, а запись новых элементов - в конец цепочки. Механизм работы очереди таков:
Здесь Элемент очереди описывается так же, как и элемент стека (здесь
однонаправленная очередь): Формирование очереди осуществляется с помощью следующей
процедуры: В данной процедуре Rw - указатель начала очереди, Lw - указатель конца очереди. Удаление из очереди производится с помощью следующей
процедуры: Применение указателей позволяет достаточно рационально использовать
оперативную память ЭВМ. Пусть требуется разработать программу транспонирования квадратной
матрицы размера NxN. Эта программа использует динамический массив и выглядит
следующим образом: THE END |
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
© Copyright(c) 2004 Amro Group. All rights reserved |
|