Динамические структуры данных
Общие сведения
Динамические структуры ‑ структуры, для которых выделяется динамическая память в процессе выполнения программы, используются указатели (п.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;