файле, т.е. использовать для этого класс, который содержит много «лишней»
информации не рационально.
Исходя из особенностей B-дерева, эта структура может быть представлена в
виде следующей записи:
BTreeNode = record
n: integer; //количество ключей, хранящихся в настоящий момент в узле х.
pos: integer; //позиция текущего узла в файле
key: array[1..2 * t - 1] of integer;
c: array[1..2 * t] of integer;
leaf: boolean; //TRUE, если х является листом, и false, если х — внутренний
узел.
end;
Для работы с этими вершинами необходимо реализовать класс «Дерево».
Именно этот класс должен содержать основные функции для работы с деревом во
внешней памяти.
TBTree = class(TObject)
private
RemMas: array of integer; //массив удаленных записей
RemMasChange: boolean; //изменен ли массив удаленных записей
procedure AddToRemMas(var r: integer); //добавление позиции (в файле) удаленной записи
function GetFreePos(DefaultPos: integer): integer;
function GetCount(): integer; //возврат количества страниц
function AllocateNode(): BTreeNode; //создание пустой страницы
procedure SplitChild(var x, y: BTreeNode; i: integer);
procedure InsertNonFull(var x: BTreeNode; k: integer);
function MaxInSubTree(var pos: integer): integer;
function MinInSubTree(var pos: integer): integer;
public
RootPos: integer; //позиция корневой страницы в файле
RemCount: integer; // размер RemMas в файле
FileName: string; //имя файла, в котором хранится дерево
constructor Create(BTreeFileName: string);
property Count: integer read GetCount;
function DiskRead(var pos: integer): BTreeNode;
procedure DiskWrite(var x: BTreeNode);
procedure Open(SrcFileName: string);
procedure SaveAs(DstFileName: string);
function Search(var pos, k: Integer): boolean;
procedure Insert(var k: integer); // встака влюча
function Remove(var x_num: integer; k: integer): boolean;
procedure UpdateFile();
end;
10