Динамические структуры данных

Общие сведения

Динамические структуры ‑ структуры, для которых выделяется динамическая память в процессе выполнения программы, используются ука­затели (п.1.1.8) и операции над указателями (п.1.2.7). Обычно они ис­поль­­зуются для динамического формирования списка - логически свя­зан­­ного набора записей, каждая из которых состоит из двух частей: адресной (содержит адреса, на логически связанные с ней, записей) и ин­фор­ма­цион­ной (поля записи с данными). Лучшим средством орга­ни­за­ции ди­на­ми­чес­ких структур является использование класса TList (п. 2.2.6).

Процедуры и функции динамического распределения памяти

AllocMem(N:Integer):Pointer ‑выделяет область из N байтов и возвращает ее адрес.

Dispose(var Р:pointer[,Destructor]) ‑ удаляет динамическую переменную по адресу P. Destructor определяет метод‑деструктор для объекта.

FreeMem(var P:pointer[;N:Integer]) ‑ удаляет динамическую переменную по адресу P и размером N байт.

GetMem(var P:pointer;N:Integer) ‑ создает новую динамическую перемен­ную по адресу Р заданного размера N.

New(var P: pointer[,Constructor]) ‑ создает новую динамическую пере­мен­ную по адресу Р. Параметр Constructor определяет метод ‑ конструктор для динамического объекта.

Addr(X): pointer ‑ возвращает адрес заданного объекта X.

Формирование стека

Под стеком понимается список, обслуживаемый по принципу «последним пришел - первым ушел».

Пример:

procedure TForm1.Test_StekClick(Sender: TObject); //стек

Type ukaz=^stack; stack=Record inf:Integer; next:ukaz; end; //типы

Var top,kon,del:ukaz; value:Integer; //переменные

Procedure sozds; //процедура создания стека из пяти записей

Var i:Integer; //переменная цикла

Begin top:=Nil; //если список пустой, начало =Nil ‑ отсутствие адреса

For i:=1 to 5 do //цикл формирования стека

Begin New(kon); //выделение памяти для новой записи

kon^.next:=top; // запоминание адреса предыдущей записи

kon^.inf:=i; //запоминание в новой значения i

top:=kon; //запоминание адреса последней записи (вершины стека)

End; {конец тела цикла} End; //конец процедуры создания стека

Procedure dobavs;//процедура добавления в стек трех записей

Var i:Integer; //переменная цикла Begin

For i:=6 to 8 do //цикл добавления записей в стек

Begin New(kon);//выделение памяти для новой записи

kon^.next:=top;kon^.inf:=i;//запоминание адреса предыдущей записи и i

top:=kon; //запоминание адреса последней записи (вершины стека)

End; {конец тела цикла добавления записей в стек}End; //конец процедуры Procedure udals; //процедура удаления записи из стека

Begin del:=top; top:=kon^.next; Dispose(del)

end;

Procedure vivods; //процедура вывода всех записей из стека

Begin kon:=top; //установка адреса вершины стека (последней записи стека)

Label1.caption:=''; //очистка объекта Label1

While kon<>Nil do //цикл вывода записей стека

Begin Label1.caption:=Label1.caption+IntToStr(kon^.inf)+','; kon:=kon^.next;

End {конец тела цикла. В результате в Label1 выведется: 7,6,5,4,3,2,1,}End; Begin //начало процедуры тестирования процедур обработки стека

sozds; dobavs; udals; vivods;//вызов процедур создания и обработки стека

end; //конец тестирования процедур обработки стека








Дата добавления: 2016-03-22; просмотров: 542;


Поиск по сайту:

При помощи поиска вы сможете найти нужную вам информацию.

Поделитесь с друзьями:

Если вам перенёс пользу информационный материал, или помог в учебе – поделитесь этим сайтом с друзьями и знакомыми.
helpiks.org - Хелпикс.Орг - 2014-2024 год. Материал сайта представляется для ознакомительного и учебного использования. | Поддержка
Генерация страницы за: 0.006 сек.