btree insert( key, t )
typekey key;
btree t;
{
typekey ins;
extern btree NewTree;
typekey InternalInsert();
ins = InternalInsert( key, t );
/*** check for growth at the root ***/
if ( ins != NoKey ) return( NewNode( ins, t, NewTree) );
return( t );
};
typekey InternalInsert( key, t )
typekey key;
btree t;
{int i, j;
typekey ins;
btree tempr;
extern btree NewTree;
if ( t == NULL ) { /*** the bottom of the tree has been reached:
indicate insertion to be done ***/
NewTree = NULL;
return( key );
}
else {
for ( i=0; id && key>t->k[i]; i++ );
if ( id && key == t->k[i] )
Error; /*** Key already in table ***/
else {
ins = InternalInsert( key, t->p[i] );
if ( ins != NoKey )
/*** the key in "ins" has to be inserted in present node ***/
if (t->d < 2*M) InsInNode( t, ins, NewTree );
else /*** present node has to be split ***/
{/*** create new node ***/
if ( i<=M ) {
tempr = NewNode( t->k[2*M-1], NULL, t->p[2*M] );
t->d--;
InsInNode( t, ins, NewTree );
}
else tempr = NewNode( ins, NULL, NewTree );
/*** move keys and pointers ***/
for ( j=M+2; j<=2*M; j++ )
InsInNode( tempr, t->k[j-1], t->p[j] );
t->d = M;
tempr->p[0] = t->p[M+1];
NewTree = tempr;
return( t->k[M] );
}
}
return( NoKey );
}
};
|