Динамические структуры данных. Алексеев А.Ю - 26 стр.

UptoLike

Unit HList;
{Реализация иерархического списка на Турбо-Паскале}
Interface
Uses Global; { модуль, в котором описан тип элементов списка El }
{============================================================== }
{Ссылочное представление в динамической памяти }
type
{ Elбазовый тип для элементов списка (описан в Global ) }
Ref_S_expr = ^ S_expr; { ссылка на Sвыражение }
record { S выражение: }
case Tag : ( Atomic, Pair ) of
Atomic : ( Atm: El ); { атомарное }
Pair : ( Hd, T l: Ref_S_expr ) { или пара }
end { S_expr }; {"голова"–"хвост"}
H_list = Ref_S_expr; {иерархический список }
{============================================================== }
{1} function Null ( x : H_list ) : Boolean;
{ список пуст }
{2}function Head ( x : H_list ) : H_List;
{селектор "голова" иерархического списка; отказ, если x атом или пустой список }
{3} function Tail ( x : H_list ) : H_list;
{ селектор "хвост" иерархического списка; отказ, если x атом или пустой список }
{4} function Cons ( x, y : H_list ) : H_list;
{ конструктор; отказ, если y атом }
{5} function Atom ( x : H_list ) : Boolean;
{ список атомарен }
{6} function Make_Atom ( x : El ) : H_list;
{ создать атомарное S выражение }
{7} function Get_El ( x : H_list ) : El;
{ получить содержимое атомарного Sвыражения; отказ, если x - не атом }
{ } function Copy ( x : H_list ): H_list;
{ копировать список }
{ } procedure Destroy ( x : H_list );
{освободить память, занятую под список }
{==============================================================}
Implementation
... {Здесь на месте ... размещаются блоки процедур функций }
end { HList }.
Рис. 1.22. Макет модуля Hlist
Далее приведен один из возможных вариантов реализации описанных
функций в секции Implementation модуля HList.
{1} function Null ( x : H_list ): Boolean;
begin
Null:= ( x = nil );
end { Null };
26
Unit HList;
       {Реализация иерархического списка на Турбо-Паскале}
Interface
Uses Global;         { модуль, в котором описан тип элементов списка El }
{============================================================== }
       {Ссылочное представление в динамической памяти }
type
{ El – базовый тип для элементов списка (описан в Global ) }
Ref_S_expr = ^ S_expr;        { ссылка на S – выражение     }
record                    { S – выражение: }
 case Tag : ( Atomic, Pair ) of
Atomic : ( Atm: El );           { атомарное      }
   Pair : ( Hd, T l: Ref_S_expr ) { или пара       }
   end { S_expr };                   {"голова"–"хвост"}
     H_list = Ref_S_expr;          {иерархический список }
{============================================================== }
{1} function Null ( x : H_list ) : Boolean;
{ список пуст }
{2}function Head ( x : H_list ) : H_List;
{селектор "голова" иерархического списка; отказ, если x – атом или пустой список }
{3} function Tail ( x : H_list ) : H_list;
 { селектор "хвост" иерархического списка; отказ, если x – атом или пустой список }
{4} function Cons ( x, y : H_list ) : H_list;
{ конструктор; отказ, если y – атом }
{5} function Atom ( x : H_list ) : Boolean;
{ список атомарен }
{6} function Make_Atom ( x : El ) : H_list;
{ создать атомарное S – выражение }
{7} function Get_El ( x : H_list ) : El;
{ получить содержимое атомарного S – выражения; отказ, если x - не атом }
{ } function Copy ( x : H_list ): H_list;
{ копировать список }
{ } procedure Destroy ( x : H_list );
{освободить память, занятую под список }
{==============================================================}
Implementation
... {Здесь на месте ... размещаются блоки процедур функций }
end { HList }.

                            Рис. 1.22. Макет модуля Hlist

     Далее приведен один из возможных вариантов реализации описанных
функций в секции Implementation модуля HList.
{1} function Null ( x : H_list ): Boolean;
   begin
       Null:= ( x = nil );
   end { Null };

                                         26