Связанные списки используются во многих алгоритмах, и вы будете встречать-
ся с ними на протяжении всей книги. В следующих разделах рассматривается
несколько специальных разновидностей связанных списков.
Циклические связанные списки
Вместо того, чтобы устанавливать поле Next Се 11 последнего элемента спис-
ка в nil, нужно сделать так, чтобы оно указывало на первый элемент списка, об-
разуя циклический список (circular list), как показано на рис. 2.7.
Рис. 2.7. Циклический связанный список
Циклические списки используются, когда нужно обходить набор элементов
в бесконечном цикле. На каждом шаге цикла программа просто перемещает указа-
тель на следующую ячейку списка. Допустим, имеется циклический список элемен-
тов, содержащих названия дней недели. В этом случае программа может перечис-
лять дни месяца, используя следующий код:
// Формирование списка и т.д.
// Печать календаря для какого-нибудь месяца.
// first_day указывает на ячейку первого дня месяца.
// num_days - это количество дней месяца.
procedure ListMonth(first_day : PDayCell; num_days : Integer);
var
ptr : PDayCell;
i : Integer;
begin
ptr := first_day;
for i := 1 to num_days do
begin
PrintEntry(Format('%d:%s',[i,ptr^.Value]));
Ptr := ptr^.NextCell;
end;
end;
Циклические списки также позволяют получить доступ ко всему списку, начи-
ная с любой позиции. Это придает списку некоторую симметрию. Программа мо-
жет работать со всеми элементами списка одинаково.
procedure ShowList(start_cell : PListCell);'
var
ptr : PListCell;
begin
ptr := start_cell;
repeat
ShowMessage(ptrA.Value);
Ptr := ptr^.NextCell;
until (ptr=start_cell);
end;
http://solo-project.com/view_electro.php?id=1539 |