Совершенно аналогичным образом можно создавать объект — двунаправленный список, в котором каждый узел имеет указатели как "влево" (на предыдущий узел), так и "вправо" (на последующий). В таком объекте полезно иметь поля:
· pLastNode — указатель на последний узел списка,
· pFirstNode — указатель на первый элемент.
· nNodes — число имеющихся на данный момент узлов (в Delphi аналогичное поля обычно носит имя Count),
· pCurrent — указатель на текущий узел списка (с которым мы в данный момент работаем),
· nCurrent — номер текущего узла.
Кроме того, надо предусмотреть методы:
· Insert (i:integer, pFig:tpFigure) — вставка нового узла с фигурой, на которую настроен pFig, в позицию с номером i (при этом номер прежнего узла с номером i становится i+1 и т.д.),
· Delete (i:integer) — уничтожение узла i,
· Exchange(i,j) — обмен двух узлов местами.
Примеры использования нашего однонаправленного списка:
a. очередь ("первый вошел — первый вышел");
b. стек ("последний вошел — первый вышел").
В случае очереди мы создаем потомка класса tList:
tQueue=object(tList)
procedure Remove;
end;
в котором процедура Remove удаляет первый узел списка, при этом оставшаяся часть списка не меняется, но второй узел становится первым и т.д., т.е. весь список как бы сдвигается на один узел к началу. В случае стека мы создаем потомка класса tList, описание которого совпадает с предыдущим случаем:
tSteck=object(tList)
procedure Remove;
end;
но в котором процедура Remove удаляет не первый, а последний узел. При этом как и в предыдущем случае оставшаяся часть списка не меняется.