Algorithms and Data Structures
Algorithms and Data Structures
Algorithms and Data Structures
Create successful ePaper yourself
Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.
N.Wirth. <strong>Algorithms</strong> <strong>and</strong> <strong>Data</strong> <strong>Structures</strong>. Oberon version 185<br />
FOR i := a.m TO R+1 BY -1 DO a.e[i] := a.e[i-1] END;<br />
a.e[R] := u; INC(a.m)<br />
ELSE (*overflow; split a into a, b <strong>and</strong> assign the middle entry to v*)<br />
NEW(b);<br />
IF R < N THEN (*insert in left pate a*)<br />
v := a.e[N-1];<br />
FOR i := N-1 TO R+1 BY -1 DO a.e[i] := a.e[i-1] END;<br />
a.e[R] := u;<br />
FOR i := 0 TO N-1 DO b.e[i] := a.e[i+N] END<br />
ELSE (*insert in right page b*)<br />
DEC(R, N);<br />
IF R = 0 THEN<br />
v := u<br />
ELSE<br />
v := a.e[N];<br />
FOR i := 0 TO R-2 DO b.e[i] := a.e[i+N+1] END;<br />
b.e[R-1] := u<br />
END;<br />
FOR i := R TO N-1 DO b.e[i] := a.e[i+N] END<br />
END;<br />
a.m := N; b.m := N; b.p0 := v.p; v.p := b<br />
END<br />
END<br />
END<br />
END<br />
END insert;<br />
PROCEDURE underflow (c, a: Page; s: INTEGER; VAR h: BOOLEAN);<br />
(*a = underflow page, c = ancestor page,<br />
s = index of deleted entry in c*)<br />
VAR b: Page; i, k: INTEGER;<br />
BEGIN<br />
(*h & (a.m = N-1) & (c.e[s-1].p = a) *)<br />
IF s < c.m THEN (*b := page to the right of a*)<br />
b := c.e[s].p;<br />
k := (b.m-N+1) DIV 2; (*k = nof items available on page b*)<br />
a.e[N-1] := c.e[s]; a.e[N-1].p := b.p0;<br />
IF k > 0 THEN (*balance by moving k-1 items from b to a*)<br />
FOR i := 0 TO k-2 DO a.e[i+N] := b.e[i] END;<br />
c.e[s] := b.e[k-1]; b.p0 := c.e[s].p;<br />
c.e[s].p := b; DEC(b.m, k);<br />
FOR i := 0 TO b.m-1 DO b.e[i] := b.e[i+k] END;<br />
a.m := N-1+k; h := FALSE<br />
ELSE (*merge pages a <strong>and</strong> b, discard b*)<br />
FOR i := 0 TO N-1 DO a.e[i+N] := b.e[i] END;<br />
DEC(c.m);<br />
FOR i := s TO c.m-1 DO c.e[i] := c.e[i+1] END;<br />
a.m := 2*N; h := c.m < N<br />
END<br />
ELSE (*b := page to the left of a*)<br />
DEC(s);<br />
IF s = 0 THEN b := c.p0 ELSE b := c.e[s-1].p END;