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;


Поиск по сайту:

При помощи поиска вы сможете найти нужную вам информацию.

Поделитесь с друзьями:

Если вам перенёс пользу информационный материал, или помог в учебе – поделитесь этим сайтом с друзьями и знакомыми.
helpiks.org - Хелпикс.Орг - 2014-2024 год. Материал сайта представляется для ознакомительного и учебного использования. | Поддержка
Генерация страницы за: 0.008 сек.