Procedure Insert(Element: TElement);
Procedure Update(link: Longint; Var rise: Boolean; Var riseElm: TElement);
Begin
Implementierung
End;
Var RootSplit: Boolean;
{ Element, welches ggf. von einem Blatt in die Wurzel hochgereicht wird }
RootElm: TElement;
I: Integer;
Begin
{ Element "Element" in Page "RootLink" einfuegen }
RootSplit:=False;
Update(RootLink,RootSplit,RootElm);
{ wurde die Wurzel geteilt ? }
If RootSplit Then
Begin
{ alte Wurzel löschen }
Dispose(RootPage);
{ neue Wurzel erstellen }
New(RootPage);
{ einziges Element ist das hochgereichte Element }
RootPage^.Anzahl:=1;
RootPage^.Elemente[0].link:=RootLink;
RootPage^.Elemente[1]:=RootElm;
{ Speicherplatz auf dem Hintergrundspeicher fuer neue
Wurzel anfodern }
RootLink:=NewBackPage;
{ Link der Wurzel aendern }
SavePage(RootLink,RootPage);
End;
End;
Prozedurschnittstelle:
Procedure Insert(Element: TElement);
Fügt das Element "Element" in einen Baum ein.
Implementierung der Prozedur "Update":
Die Prozedur ruft sich solange auf, bis die Page gefunden wurde, in die das
Element eingefügt werden soll. Wenn die Page dabei
geteilt wurde, wird das hochgereichte Element an die aufrufende Prozedur
über den Parameter "riseElm" übergeben.
Procedure Update(link: Longint; Var rise: Boolean; Var riseElm: TElement);
Var Page: PPage;
Pos,I: Integer;
gefunden, risen: Boolean;
Begin
{ Ende des Baums erreicht ? }
If link=Null Then
Begin
{ Einfuegen beenden }
rise:=True;
riseElm:=Element;
End
Else
Begin
{ Page einladen }
Page:=LoadPage(link);
{ ist einzufuegendes Element bereits vorhanden ? }
If SucheInPage(Page,Element,Pos) Then
Begin
Dispose(Page);
End
Else
Begin
{ Element wurde nicht in Page gefunden
-> Element in Unterbaum einfuegen }
risen:=False;
Update(Page^.Elemente[Pos].link,risen,riseElm);
{ wurde der Unterbaum geteilt ? }
If risen Then
Begin
{ passt hochgereichtes Element in geladene Page ? }
If Page^.Anzahl<maxElemente Then
Begin
{ Element an richtige Position in Page einfuegen }}
Inc(Page^.Anzahl);
For I:=Page^.Anzahl-1 downto Pos+1 do
Page^.Elemente[I+1]:=Page^.Elemente[I];
Page^.Elemente[Pos+1]:=riseElm;
{ geladene Page wurde nicht geteilt }
rise:=False;
End
Else
Begin
{ Element passt nicht mehr in Page
-> Page aufteilen }
Split(Page,riseElm,Pos);
rise:=True;
End;
SavePage(link,Page);
End;
Dispose(Page);
End;
End;
End;
Prozedurschnittstelle:
Procedure Update(link: Longint; Var rise: Boolean; Var riseElm: TElement);
Fügt das Element in die Page "Link" ein.
- wenn "rise" true ist, wurde die Page geteilt und ein Element hochgereicht
- "riseElm" ist in dem Fall das hochgereichte Element
+
-