52704.fb2
if Assigned(FDispose) then
FDispose(Temp^.dlnData);
DLNodeManager.FreeNode(Temp);
Temp := FHead^.dlnNext;
end;
{устранить "дыру" в связном списке}
FTail^.dlnPrior := FHead;
FCount := 0;
{установить курсор на начальный узел}
FCursor := FHead;
FCursorIx := -1;
end;
procedure TtdDoubleLinkList.DeleteAtCursor;
var
Temp : PdlNode;
begin
{записать в Temp удаляемый узел}
Temp := FCursor;
if (Temp = FHead) or (Temp = FTail) then
dllError(tdeListCannotDelete, 'Delete');
{избавиться от его содержимого}
if Assigned(FDispose) then
FDispose(Temp^.dlnData);
{удалить ссылки на узел и освободить его; курсор перемещается на следующий узел}
Temp^.dlnPrior^.dlnNext := Temp^.dlnNext;
Temp^.dlnNext^.dlnPrior := Temp^.dlnPrior;
FCursor := Temp^.dlnNext;
DLNodeManager.FreeNode(Temp);
dec(FCount);
end;
function TtdDoubleLinkList.Examine : pointer;
begin
if (FCurgor = nil) or (FCursor = FHead) then
dllError(tdeListCannotExamine, 'Examine');
{вернуть данные узла в позиции курсора}
Result := FCursor^.dlnData;
end;
procedure TtdDoubleLinkList.InsertAtCursor(aItem : pointer);
var
NewNode : PdlNode;
begin
{если курсор находится на начальном узле, не генерировать исключение, а перейти на следующий узел}
if (FCursor = FHead) then
MoveNext;
{распределить новый узел и вставить его перед позицией курсора}
NewNode := PdlNode (DLNodeManager.AllocNode);
NewNode^.dlnData := aItem;
NewNode^.dlnNext := FCursor;
NewNode^.dlnPrior := FCursor^.dlnPrior;