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


              

Пример использования функции malloc: связные списки - часть 2


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;




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