52704.fb2
Result^.sknLevel := aLevel;
end;
procedure TtdSkipList.siFreeNode(aNode : PskNode);
begin
if (aNode <> nil) then begin
if Assigned(FDispose) then
FDispose(aNode^.sknData);
SLNodeManager[aNode^.sknLevel].FreeNode(aNode);
end;
end;
class procedure TtdSkipList.slGetNodeManagers;
var
i : integer;
begin
{если диспетчеры узлов еще не созданы, создать их}
if (SLNodeManager[0] =nil) then
for i := 0 to pred(tdcMaxSkipLevels) do SLNodeManager[i] := TtdNodeManager.Create(NodeSize[i]);
end;
Обратите внимание, что метод уничтожения освобождает узлы только в том случае, когда список с пропусками создан в качестве владельца данных.
Остальные методы класса списка с пропусками еще проще - все они содержат всего несколько строк кода.
Листинг 6.22. Остальные методы класса списка с пропусками
procedure TtdSkipList.Delete
begin
{начальный и конечный узлы удалять нельзя}
if (FCursor = FHead) or (FCursor = FTail) then
slError(tdeListCannotDelete, 'Delete');
{удалить узел в позиции курсора}
Remove(FCursor^.sknData);
end;
function TtdSkipList.Examine : pointer;
begin
Result := FCursor^.sknData;
end;
function TtdSkipList.IsAfterLast : boolean;
begin
Result := FCursor = FTail;
end;
function TtdSkipList.IsBeforeFirst : boolean;
begin
Result := FCursor = FHead;
end;
function TtdSkipList.IsEmpty : boolean;
begin
Result := Count = 0;
end;
procedure TtdSkipList.MoveAf terLast;
begin
FCursor := FTail;
end;