亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? b++tree.c

?? 這是一個利用B+ Trees數據結構存儲數據的源碼,全部代碼用C語言寫的.
?? C
?? 第 1 頁 / 共 2 頁
字號:
/***********************************************************************\
|									|
|	B+tree function implementation			C++		|
|									|
|									|
|	Jan Jannink	created 5/27/94		revised 6/15/95		|
|									|
\***********************************************************************/

#include <iostream.h>
#include <iomanip.h>
#include <stdlib.h>
#include "b++tree.h"

/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*\
|	Implementation Hiding Macro Definitions				|
\*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
			/* low level definition of Nptr value usage */
#ifdef POINTER
#define nAdr(b) (b)->X
#define nodearrayhead tree
#else
#define nAdr(b) tree[(b)].X
#define nodearrayhead 0
#endif

			/* access keys and pointers in a node */
#define getkey(j, q) nAdr(j).e[(q)].key
#define getnode(j, q) nAdr(j).e[(q)].downNode
#define setkey(j, q, v) (nAdr(j).e[(q)].key = (v))
#define setnode(j, q, v) (nAdr(j).e[(q)].downNode = (v))

			/* access node flag values */
#define setflag(j, v) (nAdr(j).i.info.flags |= (v))
#define clrflag(j, v) (nAdr(j).i.info.flags &= ~(v))
#define getflags(j) nAdr(j).i.info.flags
#define clearflags(j) (nAdr(j).i.info.flags = (short) MAGIC)

			/* check that a node is in fact a node */
#define isnode(j) (((j) != NONODE) && ((nAdr(j).i.info.flags & MASK) == MAGIC))
#define isntnode(j) ((j) == NONODE)

			/* test individual flag values */
#define isinternal(j) ((nAdr(j).i.info.flags & isLEAF) == 0)
#define isleaf(j) ((nAdr(j).i.info.flags & isLEAF) == isLEAF)
#define isroot(j) ((nAdr(j).i.info.flags & isROOT) == isROOT)
#define isfull(j) ((nAdr(j).i.info.flags & isFULL) == isFULL)
#define isfew(j) ((nAdr(j).i.info.flags & FEWEST) == FEWEST)

			/* manage number of keys in a node */
#define numentries(j) nAdr(j).i.info.pairs
#define clearentries(j) (nAdr(j).i.info.pairs = 0)
#define incentries(j) (nAdr(j).i.info.pairs++)
#define decentries(j) (nAdr(j).i.info.pairs--)

			/* manage first/last node pointers in internal nodes */
#define setfirstnode(j, v) (nAdr(j).i.firstNode = (v))
#define getfirstnode(j) nAdr(j).i.firstNode
#define getlastnode(j) nAdr(j).e[nAdr(j).i.info.pairs].downNode

			/* manage pointers to next nodes in leaf nodes */
#define setnextnode(j, v) (nAdr(j).l.nextNode = (v))
#define getnextnode(j) nAdr(j).l.nextNode

			/* shift/transfer entries for insertion/deletion */
#define pushentry(j, q, v) (nAdr(j).e[(q) + (v)] = nAdr(j).e[(q)])
#define pullentry(j, q, v) (nAdr(j).e[(q)] = nAdr(j).e[(q) + (v)])
#define xferentry(j, q, v, z) (nAdr(v).e[(z)] = nAdr(j).e[(q)])
#define setentry(j, q, v, z) (nAdr(j).e[(q)].key = (v), nAdr(j).e[(q)].downNode = (z))

			/* access key and data values for B+tree methods */
			/* pass values to getSlot(), descend...() */
#define getfunkey theKey
#define getfundata theData
#define setfunkey(v) (theKey = (v))
#define setfundata(v) (theData = (v))

			/* define number of B+tree nodes for free node pool */
#define getpoolsize poolsize
#define setpoolsize(v) (poolsize = (v))

			/* access memory region containing B+tree nodes */
#define getnodearray tree
#define setnodearray(v) (tree = (Node *)(v))

			/* locations from which tree access begins */
#define getroot root
#define getleaf leaf
#define setroot(v) (root = (v))
#define setleaf(v) (leaf = (v))

			/* define max/min number of pointers per node */
#define getfanout fanout
#define getminfanout(j) ((nAdr(j).i.info.flags & isLEAF) ? fanout - minfanout: minfanout)
#define setfanout(v) (fanout = (v) - 1)
#define setminfanout(v) (minfanout = (v) - 1)

			/* manage B+tree height */
#define inittreeheight (height = 0)
#define inctreeheight height++
#define dectreeheight height--
#define gettreeheight height

			/* access pool of free nodes */
#define getfirstfreenode pool
#define setfirstfreenode(v) (pool = (v))

			/* handle split/merge points during insert/delete */
#define getsplitpath branch.split
#define getmergepath branch.merge
#define setsplitpath(v) (branch.split = (v))
#define setmergepath(v) (branch.merge = (v))

			/* exploit function to compare two B+tree keys */
#define comparekeys (keycmp)
#define setcomparekeys(v) (keycmp = (v))

			/* representation independent node numbering */
#define getnodeno(v) ((v) - nodearrayhead)


/*/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*\
|	Sample Key Comparison Function					|
\*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/

int compareKeys(keyT key1, keyT key2)
{
  return key1 - key2;		/* this is the case when keys are integer */
}


/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*\
|	B+tree Initialization Utilities					|
\*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/

/*~~~~~~~~~~~~~~~~~~~   Set up B+tree structure   ~~~~~~~~~~~~~~~~~~~~~*/
Tree::Tree(unsigned int poolsz, unsigned int fan, KeyCmp keyCmp)
{
  setfanout(fan);
  setminfanout((fan + 1) >> 1);
  initFreeNodePool(poolsz);

  setleaf(getFreeNode());		/* set up the first leaf node */
  setroot(getleaf);			/* the root is initially the leaf */
  setflag(getroot, isLEAF);
  setflag(getroot, isROOT);
  setflag(getroot, FEWEST);
  inittreeheight;

  setfunkey(0);
  setfundata("0");
  setcomparekeys(keyCmp);

#ifdef DEBUG
  cerr << "INIT:  B+tree of fanout " << fan << '.' << endl;
  showBtree();
  showNode(getroot);
#endif
}


/*~~~~~~~~~~~~~~~~~~~   Clean up B+tree structure   ~~~~~~~~~~~~~~~~~~~*/
Tree::~Tree()
{
#ifdef DEBUG
  cerr << "FREE:  B+tree at " << setw(10) << (void *) this << '.' << endl;
#endif

  delete[] getnodearray;
}


/*/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*\
|	Find location for data						|
\*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/

/*~~~~~~~~~~~~~~~~~~~~~   top level search call   ~~~~~~~~~~~~~~~~~~~~~*/
Nptr
Tree::Search(keyT key)
{
  Nptr	findNode;

#ifdef DEBUG
  cerr << "SEARCH:  key " << key << '.' << endl;
#endif

  setfunkey(key);			/* set search key */
  findNode = descendToLeaf(getroot);	/* start search from root node */

#ifdef DEBUG
  cerr << "SEARCH:  found on page " << getnodeno(findNode) << '.' << endl;
#endif

  return findNode;
}

/*~~~~~~~~~~~~~~~~~~~~~   `recurse' down B+tree   ~~~~~~~~~~~~~~~~~~~~~*/
Nptr
Tree::descendToLeaf(Nptr curr)
{
  int	slot;
  Nptr	findNode;

  for (slot = getSlot(curr); isinternal(curr); slot = getSlot(curr))
    curr = getnode(curr, slot);
  if ((slot > 0) && !comparekeys(getfunkey, getkey(curr, slot)))
    findNode = curr;			/* correct key value found */
  else
    findNode = NONODE;			/* key value not in tree */

  return findNode;
}

/*~~~~~~~~~~~~~~~~~~~   find slot for search key   ~~~~~~~~~~~~~~~~~~~~*/
int
Tree::getSlot(Nptr curr)
{
  int slot, entries;

  entries = numentries(curr);		/* need this if root is ever empty */
  slot = !entries ? 0 : findKey(curr, 1, entries);

#ifdef DEBUG
  cerr << "GETSLOT:  slot " << slot << '.' << endl;
#endif

  return slot;
}


/*/*~~~~~~~~~~~~~~~~~~~   recursive binary search   ~~~~~~~~~~~~~~~~~~~~~*/
int
Tree::findKey(Nptr curr, int lo, int hi)
{
  int mid, findslot;

#ifdef DEBUG
  cerr << "GETSLOT:  lo " << lo << ", hi " << hi << '.' << endl;
  showNode(curr);
#endif

  if (hi == lo) {
    findslot = bestMatch(curr, lo);		/* recursion base case */

#ifdef DEBUG
    if (findslot == ERROR)
      cerr << "Bad key ordering on node " << getnodeno(curr) << '.' << endl;
#endif

  }
  else {
    mid = (lo + hi) >> 1;
    switch (findslot = bestMatch(curr, mid)) {
    case LOWER:				/* check lower half of range */
      findslot = findKey(curr, lo, mid - 1);		/* never in 2-3+trees */
    break;
    case UPPER:				/* check upper half of range */
      findslot = findKey(curr, mid + 1, hi);
    break;

#ifdef DEBUG
    case ERROR:
      cerr << "Bad key ordering on node " << getnodeno(curr) << '.' << endl;
#endif

    }
  }
  return findslot;
}


/*~~~~~~~~~~~   comparison of key with a target key slot   ~~~~~~~~~~~~*/
int
Tree::bestMatch(Nptr curr, int slot)
{
  int diff, comp, findslot;

  diff = comparekeys(getfunkey, getkey(curr, slot));
  if (diff < 0) {		/* also check previous slot */
    if ((slot == 1) ||
		((comp = comparekeys(getfunkey, getkey(curr, slot - 1))) >= 0))
      findslot = slot - 1;

#ifdef DEBUG
    else if (comp < diff)
      findslot = ERROR;		/* inconsistent ordering of keys */
#endif

    else
      findslot = LOWER;		/* key must be below in node ordering */
  }
  else {			/* or check following slot */
    if ((slot == numentries(curr)) ||
		((comp = comparekeys(getfunkey, getkey(curr, slot + 1))) < 0))
      findslot = slot;
    else if (comp == 0)
      findslot = slot + 1;

#ifdef DEBUG
    else if (comp > diff)
      findslot = ERROR;		/* inconsistent ordering of keys */
#endif

    else
      findslot = UPPER;		/* key must be above in node ordering */
  }
  return findslot;
}


/*/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*\
|	Insert new data into tree					|
\*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/

/*~~~~~~~~~~~~~~~~~~~~~   top level insert call   ~~~~~~~~~~~~~~~~~~~~~*/
void
Tree::Insert(keyT key)
{
  Nptr newNode;

#ifdef DEBUG
  cerr << "INSERT:  key " << key << '.' << endl;
#endif

  setfunkey(key);			/* set insertion key */
  setfundata("data");			/* a node containing data */
  setsplitpath(NONODE);
  newNode = descendSplit(getroot);	/* insertion point search from root */
  if (newNode != getsplitpath)		/* indicates the root node has split */
    makeNewRoot(getroot, newNode);
}


/*~~~~~~~~~~~~~~~~   recurse down and split back up   ~~~~~~~~~~~~~~~~~*/
Nptr
Tree::descendSplit(Nptr curr)
{
  Nptr	newMe, newNode;
  int	slot;

  if (!isfull(curr))
    setsplitpath(NONODE);
  else if (getsplitpath == NONODE)
    setsplitpath(curr);			/* indicates where nodes must split */

  slot = getSlot(curr);			/* is null only if the root is empty */
  if (isinternal(curr))			/* continue recursion to leaves */
    newMe = descendSplit(getnode(curr, slot));
  else if ((slot > 0) && !comparekeys(getfunkey, getkey(curr, slot))) {
    newMe = NONODE;			/* this code discards duplicates */
    setsplitpath(NONODE);
  }
  else
    newMe = getDataNode(getfunkey);	/* an insertion takes place */

  newNode = NONODE;			/* assume no node splitting necessary */

  if (newMe != NONODE) {		/* insert only where necessary */
    if (getsplitpath != NONODE)
      newNode = split(curr);		/* a sibling node is prepared */
    insertEntry(curr, slot, newNode, newMe);
  }

  return newNode;
}


/*/*~~~~~~~~~~~~~~   determine location of inserted key   ~~~~~~~~~~~~~~~*/
void
Tree::insertEntry(Nptr newNode, int slot, Nptr sibling, Nptr downPtr)
{
  int split, i, j, k, x, y;

  if (sibling == NONODE) {		/* no split occurred */
    placeEntry(newNode, slot + 1, downPtr);
    clrflag(newNode, FEWEST);
  }
  else {				/* split entries between the two */
    i = isinternal(newNode);		/* adjustment values */
    split = i ? getfanout - getminfanout(newNode): getminfanout(newNode);
    j = (slot != split);
    k = (slot >= split);

    for (x = split + k + j * i, y = 1; x <= getfanout; x++, y++) {
      xferentry(newNode, x, sibling, y);	/* copy entries to sibling */
      decentries(newNode);
      incentries(sibling);
    }
    if (numentries(sibling) == getfanout)
      setflag(sibling, isFULL);		/* only ever happens in 2-3+trees */

    if (i) {				/* set first pointer of internal node */
      if (j) {
        setfirstnode(sibling, getnode(newNode, split + k));
        decentries(newNode);
      }
      else
        setfirstnode(sibling, downPtr);
    }

    if (j) {				/* insert new entry into correct spot */
      x = getkey(newNode, split + k);
      if (k)
	placeEntry(sibling, slot - split + 1 - i, downPtr);
      else
	placeEntry(newNode, slot + 1, downPtr);
      setfunkey(x);			/* set key separating nodes */
    }
    else if (!i)
      placeEntry(sibling, 1, downPtr);

    clrflag(newNode, isFULL);		/* adjust node flags */
    if (numentries(newNode) == getminfanout(newNode))
      setflag(newNode, FEWEST);
    if (numentries(sibling) > getminfanout(sibling))
      clrflag(sibling, FEWEST);

#ifdef DEBUG
  cerr << "INSERT:  slot " << slot << ", node " << getnodeno(downPtr)
								<< '.' << endl;
  showNode(newNode);
  showNode(sibling);
#endif

  }
}

/*/*~~~~~~~~~~~   place key into appropriate node & slot   ~~~~~~~~~~~~~~*/
void
Tree::placeEntry(Nptr newNode, int slot, Nptr downPtr)
{
  int x;

  for (x = numentries(newNode); x >= slot; x--)	/* make room for new entry */
    pushentry(newNode, x, 1);
  setentry(newNode, slot, getfunkey, downPtr);	/* place it in correct slot */

  incentries(newNode);				/* adjust entry counter */
  if (numentries(newNode) == getfanout)
    setflag(newNode, isFULL);
}


/*~~~~~~~~~~~~~~~~   split full node and set flags   ~~~~~~~~~~~~~~~~~~*/
Nptr
Tree::split(Nptr newNode)
{
  Nptr sibling;

  sibling = getFreeNode();

  setflag(sibling, FEWEST);			/* set up node flags */

  if (isleaf(newNode)) {
    setflag(sibling, isLEAF);
    setnextnode(sibling, getnextnode(newNode));	/* adjust leaf pointers */
    setnextnode(newNode, sibling);
  }
  if (getsplitpath == newNode)
    setsplitpath(NONODE);			/* no more splitting needed */

  return sibling;
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产米奇在线777精品观看| 亚洲美女在线国产| 久久国产夜色精品鲁鲁99| 欧美一区二区在线观看| 蜜臀av在线播放一区二区三区 | 国产成人精品www牛牛影视| 26uuu亚洲综合色| 成人永久免费视频| 亚洲色图色小说| 91精品久久久久久久久99蜜臂| 蜜桃一区二区三区四区| 国产欧美一区二区在线| 91久久香蕉国产日韩欧美9色| 亚洲1区2区3区视频| 精品播放一区二区| 欧美日韩久久久一区| 久久www免费人成看片高清| 国产午夜精品一区二区| 在线视频国内自拍亚洲视频| 久久国产视频网| 亚洲欧美综合色| 日韩一区二区三区电影| 成人激情动漫在线观看| 午夜私人影院久久久久| 久久女同互慰一区二区三区| 一本到不卡免费一区二区| 日本麻豆一区二区三区视频| 国产欧美日韩久久| 欧美日韩mp4| 成人深夜视频在线观看| 经典一区二区三区| 欧美极品aⅴ影院| 69成人精品免费视频| 不卡的看片网站| 日本vs亚洲vs韩国一区三区 | 国产亚洲欧洲一区高清在线观看| 亚洲精品久久久蜜桃| 欧美色倩网站大全免费| 国产综合久久久久影院| 一区二区不卡在线播放 | 91精品在线观看入口| 成人免费视频视频| 男男gaygay亚洲| 一区二区三区视频在线看| 精品日产卡一卡二卡麻豆| 在线亚洲精品福利网址导航| 国产精品一区专区| 日av在线不卡| 亚洲国产精品麻豆| 国产精品天美传媒| 久久精品亚洲乱码伦伦中文| 91精品国产色综合久久ai换脸| 日韩亚洲欧美综合| 色女孩综合影院| 成人在线一区二区三区| 国产一区二区美女诱惑| 免费成人av在线| 天天综合日日夜夜精品| 亚洲在线成人精品| 亚洲欧洲制服丝袜| 亚洲欧洲无码一区二区三区| 国产午夜精品在线观看| 久久视频一区二区| 欧美tickling挠脚心丨vk| 欧美精品tushy高清| 欧美日韩亚洲不卡| 91黄色免费网站| 一本一道综合狠狠老| av电影在线观看完整版一区二区| 国产精品一区二区x88av| 国产一区二区三区免费在线观看| 日本视频免费一区| 男人的天堂久久精品| 日本一不卡视频| 六月丁香婷婷色狠狠久久| 秋霞电影网一区二区| 欧美a级理论片| 久久99精品国产麻豆婷婷洗澡| 麻豆国产一区二区| 国产一区二区调教| 国产a级毛片一区| av中文字幕不卡| 色激情天天射综合网| 欧美在线观看18| 欧美日韩精品免费观看视频| 欧美日韩国产三级| 日韩女优av电影| 精品电影一区二区| 国产欧美一区二区精品性色| 日本一区二区高清| 亚洲黄色av一区| 天天综合网 天天综合色| 免费黄网站欧美| 国产乱子轮精品视频| youjizz久久| 欧美中文字幕亚洲一区二区va在线| 欧美日本免费一区二区三区| 日韩一级高清毛片| 欧美激情综合网| 亚洲激情五月婷婷| 免费观看日韩av| 国产91精品一区二区麻豆网站 | 91麻豆免费看| 欧美日韩美少妇 | 国产精品视频一二三区 | 欧美性极品少妇| 欧美一级日韩免费不卡| 久久久精品一品道一区| 亚洲丝袜美腿综合| 蜜臀av性久久久久蜜臀av麻豆 | 日韩综合在线视频| 精品一区二区久久| av成人免费在线| 宅男在线国产精品| 欧美激情综合网| 视频一区二区欧美| 夫妻av一区二区| 欧美精品久久久久久久久老牛影院| 精品国产电影一区二区| 一区二区三区在线免费视频| 美日韩一区二区| 色婷婷久久久久swag精品| 精品欧美黑人一区二区三区| 日韩理论片在线| 国产自产高清不卡| 欧美亚洲尤物久久| 中文字幕二三区不卡| 婷婷国产在线综合| eeuss鲁片一区二区三区| 日韩欧美资源站| 亚洲另类色综合网站| 国产精品中文字幕日韩精品 | 欧美夫妻性生活| 国产精品成人免费精品自在线观看| 日本怡春院一区二区| 在线欧美日韩国产| 国产精品人人做人人爽人人添| 蜜臂av日日欢夜夜爽一区| 欧美性猛片aaaaaaa做受| 国产精品视频你懂的| 美女尤物国产一区| 8x8x8国产精品| 一区二区三区丝袜| 99精品热视频| 午夜a成v人精品| 色综合天天综合色综合av| 国产欧美一区二区精品久导航| 蜜桃视频在线观看一区二区| 欧美视频在线观看一区| 综合在线观看色| 成人手机电影网| 国产精品无码永久免费888| 久久99精品国产91久久来源| 91精品在线麻豆| 日韩一区精品视频| 欧美绝品在线观看成人午夜影视| 一区二区三区视频在线观看| 99久久精品免费| 国产精品不卡一区二区三区| 国产不卡一区视频| 久久久亚洲国产美女国产盗摄 | 欧美性xxxxx极品少妇| 亚洲色图第一区| 91色porny在线视频| 亚洲欧美电影一区二区| 不卡一区二区三区四区| 日韩一区欧美小说| 色婷婷香蕉在线一区二区| 亚洲另类春色校园小说| 在线观看不卡视频| 亚洲一区二区三区影院| 欧美日韩一区二区三区高清| 亚洲国产一区二区三区| 欧美精品日日鲁夜夜添| 热久久一区二区| 久久久不卡网国产精品二区| 国产激情视频一区二区三区欧美 | 日韩欧美一区在线| 久久se这里有精品| 国产欧美日韩综合精品一区二区| 国产凹凸在线观看一区二区| 国产精品女上位| 日本乱人伦一区| 午夜国产精品一区| 精品国产乱子伦一区| 国产成a人亚洲精| 亚洲精品欧美激情| 欧美日韩一卡二卡| 久久成人18免费观看| 国产日韩欧美一区二区三区乱码| 顶级嫩模精品视频在线看| 亚洲视频中文字幕| 欧美精品欧美精品系列| 国产九色精品成人porny| 亚洲欧洲日韩女同| 欧美年轻男男videosbes| 精品一区二区三区视频在线观看| 欧美国产日产图区| 欧美日本一区二区| 国产成人综合自拍|