IfFileSize(F) < 1 then
Const
nKnot = 2; // Минимальное число ключей на странице
Type
MyRecord = record
// Тип записи для компоненты файла дерева
nData: integer;
mData: array[1 .. 2 * nKnot + 1] of integer;
mLink: array[0 .. 2 * nKnot + 1] of longint;
end;
MyRecordLong = record
// Тип записи для слияния двух компонент в одну
nData: integer;
mData: array[1 .. 4 * nKnot] of integer;
mLink: array[0 .. 4 * nKnot] of longint;
end;
procedureIncludeKey(sFind: integer;
varlStartPage: longint;
varsUp: integer;
varlUp: longint);
// sUp - ключ, который должен подняться вверх
// lUp - ссылка с того ключа, который должен подняться вверх
// lUp - номер новой страницы, если старая разделилась на две
Var
R, RAux: MyRecord;
i, iL, iR: integer;
bTerminal: boolean;
procedureClearPage;
Var
i: integer;
Begin
R.nData := 0;
fori := 1 to2 * nNode + 1 do
Begin
R.mData[i] := -1;
R.mLink[i] := -1;
end;
R.mLink[0] := -1;
end;
procedureInsertItem(iNew: Integer;
sNew: string; lNew: longint);
Var
i: integer;
Begin
fori := R.nData downtoiNew do
Begin
R.mData[i + 1] := R.mData[i];
R.mLink[i + 1] := R.mLink[i];
end;
R.mData[iNew] := sNew;
R.mLink[iNew] := lNew;
Inc(R.nData);
IfR.nData > 2 * nNode then
// => R.nData = 2 * nNode + 1
Begin
fori := 1 tonNode do
Begin
RAux.mData[i] := R.mData[i + nNode + 1];
RAux.mLink[i] := R.mLink[i + nNode + 1];
end;
RAux.mLink[0] := R.mLink[nNode + 1];
R.nData := nNode;
RAux.nData := nNode;
sUp := R.mData[nNode + 1];
fori := nNode + 1 to2 * nNode + 1 do
Begin
R.mData[i] := -1;
R.mLink[i] := -1;
RAux.mData[i] := -1;
RAux.mLink[i] := -1;
end;
iflStartPage = 0 then
Begin
lUp := FileSize(F);
SeekAndWrite(lUp, R);
ClearPage;
R.nData := 1;
R.mData[1] := sUp;
R.mLink[0] := lUp;
lUp := FileSize(F);
SeekAndWrite(lUp, RAux);
R.mLink[1] := lUp;
sUp := -1;
lUp := -1;
End
Else
Begin
lUp := FileSize(F);
SeekAndWrite(lUp, RAux);
end;
End
Else
Begin
sUp := -1;
lUp := -1;
end;
SeekAndWrite(lStartPage, R);
end;
Begin
ifFileSize(F) < 1 then
Begin
ClearPage;
InsertItem(1, sFind, -1);
SeekAndWrite(0, R);
Exit;
end;
SeekAndRead(lStartPage, R);
ifR.mLink[0] < 0 thenbTerminal := True elsebTerminal := False;
// Других потомков тоже нет
iR := StringCompare(sFind, R.mData[1]);
ifiR = 0 then
Begin
nRFound := lStartPage;
nDFound := 1;
Exit;
end;
Дата добавления: 2015-08-21; просмотров: 478;