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

UptoLike

{6} function Make_Atom ( x : El ): H_list;
var p : H_list;
begin
if MaxAvail >= SizeOf ( S_expr ) then
begin New ( p );
Make_Atom := p;
p ^ . Tag := Atomic; p ^ . Atm := x;
end
else
begin WriteLn; WriteLn ( ' ! Исчерпана память ' ); Halt; end;
end { Make_Atom };
{7} function Get_El ( x : H_list ): El;
begin
if not Atom ( x ) then
begin WriteLn; WriteLn( ' ! Get_El ( not Atom ) ' ); Halt; end
else Get_El := x ^ . Atm;
end { Get_El };
{ } function Copy ( x : H_list ): H_list;
begin
if Null ( x ) then Copy := nil
else if Atom ( x ) then Copy := Make_Atom ( x ^.Atm )
else Copy := Cons ( Copy( Head( x ) ), Copy ( Tail( x ) ) );
end { Copy };
{ } procedure Destroy ( x : H_list );
begin
if not Null ( x ) then
begin
if not Atom ( x ) then
begin Destroy ( Head ( x ) ); Destroy ( Tail( x ) ); end;
Dispose ( x );
end;
end { Destroy };
Отметим, что предложенная функция Cons не формирует копий исходных
S – выражений, а только создает экземпляр записи типа S_expr (вариант Pair )
и записывает ссылки на "голову" и "хвост" конструируемого S выражения в
поля Hd и Tl этого экземпляра соответственно. Программист, таким образом,
должен сам заботиться о копировании списочных структур, избегая побочного
эффекта от включения одних списков в другие в качестве фрагментов. Пояс-
ним сказанное на ранее рассмотренных в 1.6 примерах функций рекурсивной
обработки линейных списков. Вернемся еще раз к этим примерам и рассмот-
рим, как указанные функции могут быть реализованы применительно к иерар-
хическим спискам с использованием модуля HList.
28
{6} function Make_Atom ( x : El ): H_list;
   var p : H_list;
   begin
      if MaxAvail >= SizeOf ( S_expr ) then
           begin New ( p );
                Make_Atom := p;
                p ^ . Tag := Atomic; p ^ . Atm := x;
   end
   else
   begin WriteLn; WriteLn ( ' ! Исчерпана память ' ); Halt; end;
    end { Make_Atom };

{7} function Get_El ( x : H_list ): El;
    begin
      if not Atom ( x ) then
             begin WriteLn; WriteLn( ' ! Get_El ( not Atom ) ' ); Halt; end
      else Get_El := x ^ . Atm;
    end { Get_El };
{ } function Copy ( x : H_list ): H_list;
    begin
      if Null ( x ) then Copy := nil
      else if Atom ( x ) then Copy := Make_Atom ( x ^.Atm )
            else Copy := Cons ( Copy( Head( x ) ), Copy ( Tail( x ) ) );
      end { Copy };
{ } procedure Destroy ( x : H_list );
    begin
      if not Null ( x ) then
            begin
                 if not Atom ( x ) then
                       begin Destroy ( Head ( x ) ); Destroy ( Tail( x ) ); end;
                 Dispose ( x );
            end;
      end { Destroy };

    Отметим, что предложенная функция Cons не формирует копий исходных
S – выражений, а только создает экземпляр записи типа S_expr (вариант Pair )
и записывает ссылки на "голову" и "хвост" конструируемого S – выражения в
поля Hd и Tl этого экземпляра соответственно. Программист, таким образом,
должен сам заботиться о копировании списочных структур, избегая побочного
эффекта от включения одних списков в другие в качестве фрагментов. Пояс-
ним сказанное на ранее рассмотренных в 1.6 примерах функций рекурсивной
обработки линейных списков. Вернемся еще раз к этим примерам и рассмот-
рим, как указанные функции могут быть реализованы применительно к иерар-
хическим спискам с использованием модуля HList.

                                         28