TYPE
Link=^data; {указатель на тип данных }
data=record {описание самого типа данных }
FIO:string[50]; {ФИО }
Tel:string[10]; {телефон }
next:Link; {указатель (адрес) на следующую запись}
end;
VAR
P,First:Link; {указатели на запись: текущую, первую }
BEGIN
writeln('Число свободных блоков в динамически распределяемой области памяти:');
writeln('До загрузки данных = ',memavail);
P:=new(Link); {=1= выделить память и адрес записать в P}
P^.FIO:='Шабаров П.С'; {=2= выделенную память заполнить данными }
P^.Tel:='93-2-46';
P^.next:=nil;
First:=P;
P:=new(Link); {=3=}
P^.FIO:='Соловьев А.А.'; {=4=}
P^.Tel:='3-12-41';
P^.next:=First;
First:=P;
P:=new(Link); {=5=}
P^.FIO:='Липовский Р.Е.'; {=6=}
P^.Tel:='3-32-17';
P^.next:=First;
First:=P;
writeln('После загрузки данных = ',memavail);
while P<>nil do
begin
First:=P^.next; {сохранить адрес указывающий на следующую запись}
dispose(P); {=7= освободить память по текущему адресу }
P:=First; {сохраненный адрес записать в P }
end;
writeln('После удаления данных = ',memavail);
readln;
END.
Данная программа показывает: как создать простой связанный список, что происходит с динамической памятью и как освободить память занимаемую списком.
- Для создания списка сначала создаем тип — какие данные будут в памяти.
Тип берем RECORD (запись). Основной переменной любого связанного списка является — переменная-указатель, которая указывает на следующую запись.
Переменная-указатель — занимает 4 байта и хранит в себе какой-либо адрес.
В данной программе переменная-указатель это: next, P, First. - Необходимо указать на какой тип указывает переменная-указатель.
В данной программе тип указателя это: Link. - Выделяем новую динамическую память и сохраняем адрес (где расположена выделенная память).
- P:=new(Link);
- Заполняем нужными данными переменную-указатель.
- P^.FIO:=’Шабаров П.С’; P^.Tel:=’93-2-46′;
- Заполняем нужными данными переменную-указатель: записываем адрес для следующей записи.P^.next:=nil;Если запись первая, то переменная-указатель следующей записи должен указывать на пустой указатель — nil.
- Сохраняем адрес P в First (можно было сохранить сразу после 3-го действия).First:=P;
- Если нужны еще записи, то переходим к действию 3.
- Связанный список готов.
- Далее выполняем действия.
while P<>nil do
begin
First:=P^.next;
dispose(P);
P:=First; end;
Для обхода всех записей списка делаем вот такой цикл:
P:=First; {начать с первой записи }
while P<>nil do {выполняем пока не дошли до конца}
begin
... {что-то делаем }
...
P:=P^.next; {переходим к следующей записи }
end;