Системное программирование в UNIX средствами Free Pascal


         

MEMBER поле m_text может содержать


MEMBER поле m_text может содержать ложный, но правдоподобный адрес.

Рис. 12.1. Связный список объектов MEMBER
{$i list.inc}
(* Функция new_member - выделить память для нового элемента *)
function new_member (data:pchar):pMEMBER;
var
  newmem:pMEMBER;
begin
  newmem := malloc (sizeof (MEMBER));
  if newmem = nil then
    writeln (stderr, 'new_member: недостаточно памяти')
  else
  begin
    (* Выделить память для копирования данных *)
    newmem^.m_data := malloc (strlen (data) + 1);
    (* Скопировать данные в структуру *)
    strcopy (newmem^.m_data, data);
    (* Обнулить указатель в структуре *)
    newmem^.m_next := nil;
  end;
  new_member:=newmem;
end;
Следующая процедура add_member добавляет в список, на который указывает head, новый элемент
MEMBER. Как видно из текста процедуры, элемент MEMBER добавляется всегда в начало списка.
{$i list.inc}
(* Процедура add_member - добавить новый элемент MEMBER *)
procedure add_member (head:ppMEMBER; newmem:pMEMBER);
begin
  (* Эта простая процедура вставляет новый
   * элемент в начало списка
   *)
  newmem^.m_next := head^;
  head^ := newmem;
end;
Последняя процедура – free_list. Она принимает указатель на начало списка head^ и освобождает память, занятую всеми структурами MEMBER, образующими список. Она также обнуляет указатель head^, гарантируя, что в указателе head^ не содержится прежнее значение (иначе при случайном использовании head^ могла бы возникать трудноуловимая ошибка).
{$i list.inc}
(* Процедура free_list - освободить занятую списком память *)
procedure free_list (head:ppMEMBER);
var
  curr, next:pMEMBER;
begin
  curr := head^;
  while curr <> nil do
  begin
    next := curr^.m_next;
    (* Освободить память, занятую данными *)
    free (curr^.m_data);
    (* Освободить память, отведенную под структуру списка *)
    free (curr);
    curr := next;
  end;
  (* Обнулить указатель на начало списка *)
  head^ := nil;
end;

Содержание  Назад  Вперед