Динамические структуры (списки, деревья, графы) подробно рассмотрены в учебнике [1]. Примеры в этой лекции построены на основе примеров из этого учебника.
type tip_info = <тип данных, хранящий информацию, например: integer>; PElement = ^TElement; TElement = record inf : tip_info; next : PElement; end;
Описание типа PElement - пример ИСКЛЮЧЕНИЯ из общего правила, согласно которому неизвестный идентификатор должен появиться сначала в левой части описания (а в правой части - его определение) и только после этого может использоваться в правой части. Здесь в правой части описания находится неизвестный идентификатор TElement. Такое исключение допустимо, если этот неизвестный идентификатор описан в следующей строке.
Существуют понятия: ГОЛОВА списка (первый элемент) и КОНЕЦ списка. Рассмотрим устройство списка и действия с ним.
Для создания такого списка нужна переменная head типа PElement, содержащая адрес
1-го элемента списка. Поле next 1-го элемента списка должно содержать адрес
2-го элемента списка (иначе говоря: ссылаться на 2-й элемент списка) и т д.
Поле next последнего элемента списка должно ссылаться на NIL. Это необходимо для распознавания конца списка.
Заполнение и просмотр списка.
Program spisok1; type tip_info = string; PElement = ^TElement; TElement = record inf : tip_info; next : PElement; end; Tproc = procedure (SomeElement: PElement); const head: PElement = nil; {указатель на голову списка. Используем ТИПИЗИРОВАННУЮ константу} procedure Insert1 (var SomeElement: PElement; info: string); {Вставка нового элемента в начало списка. Адрес элемента возвращается через параметр-переменную SomeElement} var bufi: string; bufel: PElement; begin New(bufel); bufel^.inf := info; bufel^.next:= SomeElement; SomeElement:= bufel; end; procedure Browser(SomeElement: PElement; Proc: TProc); {Перемещение по списку. Для каждого элемента выполняется процедура Proc (параметр процедурного типа)} begin writeln(' ----- Просмотр списка ------ '); writeln; while SomeElement <> Nil do begin Proc(SomeElement); SomeElement:= SomeElement^.next; end; end; {$F+} procedure ShowElement(SomeElement: PElement); {Показать информацию, хранимую элементом и его адрес} var se,of1,ad: longint; begin se:= seg(SomeElement^); of1:= ofs(SomeElement^) ; ad:= se*16 + of1; writeln(SomeElement^.inf:20,' SEG= ',se,' OFS= ',of1,' Адрес = ',ad); end; {$F-} procedure IsertHead(var head: PElement); var info: string; begin writeln('Объем доступной памяти кучи (MemAvail) = ',MemAvail); info:= 'текст'; while info <> '' do begin write ('Введи информацию (текст). Выход - пустая строка '); readln(info); if info = '' then break; Insert1 (head,info); writeln( 'Вставил элемент. Объем доступной памяти = ',MemAvail); end; end; begin {начало главной программы} IsertHead(head); Browser(head, ShowElement); end. ----- Результаты работы ----- Объем доступной памяти кучи (MemAvail) = 294752 Введи информацию (текст). Выход - пустая строка aa Вставил элемент. Объем доступной памяти = 294488 Введи информацию (текст). Выход - пустая строка bb Вставил элемент. Объем доступной памяти = 294224 Введи информацию (текст). Выход - пустая строка ccc Вставил элемент. Объем доступной памяти = 293960 Введи информацию (текст). Выход - пустая строка dddd Вставил элемент. Объем доступной памяти = 293696 Введи информацию (текст). Выход - пустая строка e Вставил элемент. Объем доступной памяти = 293432 Введи информацию (текст). Выход - пустая строка ----- Просмотр списка ------ e SEG= 22603 OFS= 0 Адрес = 361648 dddd SEG= 22586 OFS= 8 Адрес = 361384 ccc SEG= 22570 OFS= 0 Адрес = 361120 bb SEG= 22553 OFS= 8 Адрес = 360856 aa SEG= 22537 OFS= 0 Адрес = 360592Комментарии: