//Default order is 5 and then split the node. void bPlusTree::split(int key, bPlusTreeNode *c, bPlusTreeNode *n, int k, int *y, bPlusTreeNode **newnode) { int i, mid; if (k <= MIN) mid = MIN; else mid = MIN + 1; *newnode = new bPlusTreeNode; for (i = mid + 1; i <= MAX; i++) { (*newnode)->value[i - mid] = n->value[i]; (*newnode)->child[i - mid] = n->child[i]; } (*newnode)->count = MAX - mid; n->count = mid; if (k <= MIN) fillnode(key, c, n, k); else fillnode(key, c, *newnode, k - mid); *y = n->value[n->count]; (*newnode)->child[0] = n->child[n->count]; n->count--; }
/** * @brief Btree::split * @param Ipointer * @param temp * @param node * @param kposition * @param ypos * @param newnode *separate the tree in the childrens */ void Btree ::split(int Ipointer, Node *temp, Node *node, int kposition, int *ypos, Node **newnode) { int i, mid ; if ( kposition <= MIN ) mid = MIN ; else mid = MIN + 1 ; *newnode = new Node ; for ( i = mid + 1 ; i <= MAX ; i++ ) { ( *newnode ) -> value[i - mid] = node -> value[i] ; ( *newnode ) -> child[i - mid] = node -> child[i] ; } ( *newnode ) -> count = MAX - mid ; node -> count = mid ; if ( kposition <= MIN ) fillnode ( Ipointer, temp, node, kposition ) ; else fillnode ( Ipointer, temp, *newnode, kposition - mid ) ; *ypos = node -> value[node -> count] ; ( *newnode ) -> child[0] = node -> child[node -> count] ; node -> count-- ; }
//Check whether the key exists or not. int bPlusTree::setkey(int val, bPlusTreeNode *n, int *p, bPlusTreeNode **ch) { int key; if (n == NULL) { *p = val; *ch = NULL; return 1; } else { if (searchnode(val, n, &key)) cout << endl << "Key value already exists." << endl; else if (setkey(val, n->child[key], p, ch)) { if (n->count < MAX) { fillnode(*p, *ch, n, key); return 0; } else { split(*p, *ch, n, key, p, ch); return 1; } } return 0; } }
int Btree ::setIpointer(int Ipointer, Node *node, int *point, Node **temp) { int pos ; if ( node == NULL ) { *point = Ipointer ; *temp = NULL ; return 1 ; } else { if ( searchnode ( Ipointer, node, &pos ) ) cout << "Ya existe" << endl ; if ( setIpointer( Ipointer, node -> child[pos], point, temp) ) { if ( node -> count < MAX ) { fillnode ( *point, *temp, node, pos ) ; return 0 ; } else { split ( *point, *temp, node, pos, point, temp ) ; return 1 ; } } return 0 ; } }
/* update is called only for TXT_FULL tables */ static void update (txtnode_t *pnode, long ptim) { txtnode_t *cnode, *seennode; long ctim; int i; Gawsetmode (&Gwidgets[pnode->u.f.t.mwi], TRUE); if (!pnode->u.f.t.list) buildlist (pnode); else if (ptim < Tgettime (pnode->vo)) rebuildlist (pnode); for ( i = 0, cnode = &pnode->u.f.t.list[0]; i < pnode->u.f.t.n; i++, cnode++ ) { ctim = cnode->time; if (txtvo2toggle == cnode->vo) { switch (cnode->mode) { case TXT_SEEN: break; case TXT_ABSTRACT: unfillnode (cnode); cnode->mode = TXT_FULL; fillnode (pnode, cnode); break; case TXT_FULL: unfillnode (cnode); cnode->mode = TXT_ABSTRACT; fillnode (pnode, cnode); break; } } if (!(seennode = findseen (cnode))) add2seen (cnode); if ( seennode && cnode->mode == TXT_SEEN && seennode->ko != cnode->u.s.ko ) { unfillnode (cnode); cnode->u.s.txtnode = seennode; cnode->u.s.ko = seennode->ko; fillnode (pnode, cnode); } else if (seennode && cnode->mode != TXT_SEEN) { unfillnode (cnode); cnode->mode = TXT_SEEN; cnode->u.s.txtnode = seennode; cnode->u.s.ko = seennode->ko; fillnode (pnode, cnode); } else if (!seennode && cnode->mode == TXT_SEEN) { unfillnode (cnode); cnode->mode = TXT_ABSTRACT; fillnode (pnode, cnode); } else if (cnode->time == -1) { unfillnode (cnode); if (seennode) cnode->u.s.txtnode = seennode; fillnode (pnode, cnode); } if (cnode->ttype == T_TABLE && cnode->mode == TXT_FULL) update (cnode, ctim); } Gaworder (&Gwidgets[pnode->u.f.t.mwi], pnode, orderfunc); Gawsetmode (&Gwidgets[pnode->u.f.t.mwi], FALSE); }