Задача 585 на Pascal
Для тех кто хочет разобраться как работать со связанным списком!
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; |
Так, это еще не все. Обязательно скачайте файл - там исходник программы и графическое пояснение что и как происходит при выполнении этой программы.
Внимательно прочитайте этот материал, затем разберитесь с помощью графического пояснения как работает программа, и вы поймете, как работать со связанным списком!