Очередь, стек, двунаправленный список.

Совершенно аналогичным образом можно создавать объект — двунаправленный список, в котором каждый узел имеет указатели как "влево" (на предыдущий узел), так и "вправо" (на последующий). В таком объекте полезно иметь поля:

· 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 удаляет не первый, а последний узел. При этом как и в предыдущем случае оставшаяся часть списка не меняется.