免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3289 | 回复: 7
打印 上一主题 下一主题

我写的一个btree实现的代码 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-12-23 01:58 |只看该作者 |倒序浏览
一直没有找到实现的代码,前段时间写了一个,数据库里的索引就是用的整个东西实现的



  1.      1  /* btree implementation example ,any bug send mail to serenaiad@126.com
  2.      2  
  3.      3  You can modify,destribute this code , please reserve this note when destribute this code.
  4.      4  */
  5.      5  #include <stdio.h>
  6.      6  #include <stdlib.h>
  7.      7
  8.      8
  9.      9  #define NODESIZE       3                   //number of values  each node
  10.     10  #define TOTALNODES     100                 //number of nodes
  11.     11
  12.     12
  13.     13  typedef enum {
  14.     14  inner,leaf
  15.     15  } nodetype;
  16.     16
  17.     17  typedef struct{
  18.     18  int nodeindex;
  19.     19  int valueindex;
  20.     20  int pointer;
  21.     21  } valuelocation;
  22.     22
  23.     23  typedef struct{
  24.     24  nodetype type;
  25.     25  int valuecount;
  26.     26  int values[NODESIZE];
  27.     27  int pointers[NODESIZE+1];
  28.     28  } node;
  29.     29
  30.     30  int freenode;               //the first free node
  31.     31  int rootnode;               //root node
  32.     32  node nodes[TOTALNODES];     //nodes array
  33.     33
  34.     34
  35.     35  int CreateBtree();
  36.     36  int LoadBtree();
  37.     37  int WriteBtree();
  38.     38  int InsertValue(int value,int pointer);
  39.     39  int DeleteValue(int value);
  40.     40  char *GetSysTime();
  41.     41
  42.     42
  43.     43  /* find the node index for new value to insert  ,return  -1 if the btree is empty(no value in it) */
  44.     44  int FindNewValueNode(int value,int path[]);
  45.     45
  46.     46  /* 一个中间节点中,要搜索指定的值,需要查找向那个指针所指向的节点去搜索,
  47.     47  这里返回下一级节点指针在指针数组中的index                       */
  48.     48  int FindValuePtIndex(int value,node* n);
  49.     49
  50.     50  /* 把一个节点,指针对插入到一个中间节点去
  51.     51  index: 这个节点的index, value: 值, pointer 指针
  52.     52  path: 从根节点到叶节点的全路径
  53.     53  */
  54.     54  void InsertPtToInnerNode(int index,int value,int pointer, int path[]);
  55.     55
  56.     56  void DeletePtInnerNode(int index,int minvalue,int pointer,int path[]);
  57.     57  void PrintBtree();
  58.     58  void PrintNode(int index);
  59.     59
  60.     60  /* 从空余节点中取一个全新的节点 */
  61.     61  int GetFreeNode();
  62.     62  int ReleaseNode(int index);
  63.     63
  64.     64  /* 查找某值,如果值存在,返回这个值所在节点的index , 如果不存在,返回 -1 */
  65.     65  valuelocation FindValue(int value);
  66.     66
  67.     67  /* 当某个根节点的最小值改变了以后,他的某个父节点的值需要调整
  68.     68  path - access path ; indexstart - 从哪一级开始 ; val - 老值 ; newval - 新值 */
  69.     69  void UpdateAncestorNodeMinValue(int path[],int posstart,int val,int newval);
  70.     70  /* 经过一个节点可以访问到的最小值 */
  71.     71  int MinValueThroughNode(int index);
  72.     72  void Usage();
  73.     73  void test();
  74.     74  int FindNodeValueIndex(int value, node* n);
  75.     75  void DeleteValueInLeafNode(node* n,int value);
  76.     76  int GetPosInAccessPath(int index , int path[]);
  77.     77  void DeletePointerInInnerNode(node* n,int index, int path[], int pointer,int minvalue);
  78.     78  //验证一个节点的的值和指针是否正确
  79.     79  int VerifyNode(int index);
  80.     80  int VerifyBtree();
  81.     81
  82.     82  int main(int argc, char* argv[])
  83.     83  {
  84.     84  valuelocation l;
  85.     85          if(argc==1)
  86.     86          {
  87.     87                  Usage();
  88.     88                  return 0;
  89.     89          }
  90.     90          if(strcmp(argv[1],"-create")==0)
  91.     91                  CreateBtree();
  92.     92          if(strcmp(argv[1],"-i")==0)
  93.     93          {
  94.     94                  LoadBtree();
  95.     95                  if(InsertValue(atoi(argv[2]),atoi(argv[3]))!=0)
  96.     96                          printf("Insert Value Failed.\n");
  97.     97                  WriteBtree();
  98.     98          }
  99.     99          if(strcmp(argv[1],"-p")==0)
  100.    100                  PrintBtree();
  101.    101          if(strcmp(argv[1],"-pn")==0)
  102.    102          {
  103.    103                  LoadBtree();
  104.    104                  PrintNode(atoi(argv[2]));
  105.    105          }
  106.    106          if(strcmp(argv[1],"-test")==0)
  107.    107                  test();
  108.    108          if(strcmp(argv[1],"-f")==0)
  109.    109          {
  110.    110                  LoadBtree();
  111.    111                  l=FindValue(atoi(argv[2]));
  112.    112                  if(l.nodeindex==-1 )
  113.    113                          printf("Value %d not found.\n",atoi(argv[2]));
  114.    114                  else
  115.    115                          printf("Value %d found , pointer:%d\n",atoi(argv[2]),l.pointer);
  116.    116          }
  117.    117          if(strcmp(argv[1],"-d")==0)
  118.    118          {
  119.    119                  LoadBtree();
  120.    120                  if(DeleteValue(atoi(argv[2]))!=0)
  121.    121                          printf("delete value failed.\n");
  122.    122                  WriteBtree();
  123.    123          }
  124.    124          if(strcmp(argv[1],"-verify")==0)
  125.    125          {
  126.    126                  LoadBtree();
  127.    127                  VerifyBtree();
  128.    128          }
  129.    129          return 0;
  130.    130  }
  131.    131
  132.    132  int CreateBtree()
  133.    133  {
  134.    134  FILE* f;
  135.    135  node n;
  136.    136  int itmp;
  137.    137  int i;
  138.    138          if((f=fopen("btree.dat","w"))==NULL)
  139.    139          {
  140.    140                  printf("Can't open file!\n");
  141.    141                  return 1;
  142.    142          }
  143.    143          freenode=0;
  144.    144          rootnode=-1;
  145.    145          fwrite(&freenode,1,sizeof(int),f);
  146.    146          fwrite(&rootnode,1,sizeof(int),f);
  147.    147          for (i=0;i<TOTALNODES;i++)
  148.    148          {
  149.    149                  n.pointers[NODESIZE]=i+1;
  150.    150                  if(i==(TOTALNODES-1))
  151.    151                          n.pointers[NODESIZE]=-1;
  152.    152                  fwrite(&n,1,sizeof(n),f);
  153.    153          }
  154.    154          fclose(f);
  155.    155  }
  156.    156
  157.    157  void Usage()
  158.    158  {
  159.    159          printf("Usage: btree -create | -i value | -d value | -e value\n");
  160.    160          printf("-create : create new btree file.\n");
  161.    161          printf("-p : print btree.\n");
  162.    162          printf("-pn nodeindex : print node nodeindex\n");
  163.    163          printf("-i value : insert new value.\n");
  164.    164          printf("-d value : delete a value.\n");
  165.    165          printf("-f value : find if value exists.\n");
  166.    166          printf("-verify : verify if the btree is correct.\n");
  167.    167  }
  168.    168
  169.    169  int LoadBtree()
  170.    170  {
  171.    171  FILE* f;
  172.    172          if((f=fopen("btree.dat","r"))==NULL)
  173.    173          {
  174.    174                  printf("Can't open file.\n");
  175.    175                  return 1;
  176.    176          }
  177.    177          fread(&freenode,1,sizeof(int),f);
  178.    178          fread(&rootnode,1,sizeof(int),f);
  179.    179          fread(nodes,1,sizeof(node)*TOTALNODES,f);
  180.    180          fclose(f);
  181.    181          return 0;
  182.    182  }
  183.    183  int WriteBtree()
  184.    184  {
  185.    185  FILE* f;
  186.    186          if((f=fopen("btree.dat","w"))==NULL)
  187.    187          {
  188.    188                  printf("Can't open file.\n");
  189.    189                  return 1;
  190.    190          }
  191.    191          fwrite(&freenode,1,sizeof(int),f);
  192.    192          fwrite(&rootnode,1,sizeof(int),f);
  193.    193          fwrite(nodes,1,sizeof(node)*TOTALNODES,f);
  194.    194          fclose(f);
  195.    195          return 0;
  196.    196  }
  197.    197
  198.    198  int InsertValue(int value,int pointer)
  199.    199  {
  200.    200  node* n;
  201.    201  node* newNode;
  202.    202  node* pn;
  203.    203  int i,inode,insertPos,ni,pi;
  204.    204  int tmpvalues[NODESIZE+1];
  205.    205  int tmppointers[NODESIZE+1];
  206.    206  int halfsize=(NODESIZE+1)/2;
  207.    207  int path[101];
  208.    208  int pathindex;
  209.    209  int minval,newval;
  210.    210  int pos;
  211.    211
  212.    212          insertPos=-1;
  213.    213          inode=FindNewValueNode(value,path); //先找出需要往那个节点里插入值
  214.    214
  215.    215          if( inode==-1) // 如果这是btree中的第一个值
  216.    216          {
  217.    217                  ni=GetFreeNode();
  218.    218                  n=nodes+ni;
  219.    219                  rootnode=ni;
  220.    220                  n->type=leaf;
  221.    221                  n->valuecount=1;
  222.    222                  n->values[0]=value;
  223.    223                  n->pointers[0]=pointer;
  224.    224                  n->pointers[NODESIZE]=-1;
  225.    225          }
  226.    226          else
  227.    227          {
  228.    228                  n=nodes+inode;
  229.    229                  for(i=0;i<n->valuecount;i++)
  230.    230                  {
  231.    231                          if(value==n->values[i])
  232.    232                                  return 1;
  233.    233                  }
  234.    234                  for(i=1;i<=path[0];i++)
  235.    235                  {
  236.    236                          if(inode==path[i])
  237.    237                                  pathindex=i;
  238.    238                  }
  239.    239                  if (n->valuecount==NODESIZE) // the leaf node needs to split
  240.    240                  {
  241.    241                          ni=GetFreeNode();
  242.    242                          newNode=nodes+ni;
  243.    243                          newNode->type=leaf;
  244.    244                          newNode->valuecount=NODESIZE+1-halfsize;
  245.    245                          for(i=0;i<NODESIZE;i++)
  246.    246                          {
  247.    247                                  if(value< n->values[i])
  248.    248                                  {
  249.    249                                          insertPos=i;
  250.    250                                          break;
  251.    251                                  }
  252.    252                          }
  253.    253                          if(insertPos==-1)
  254.    254                                  insertPos=NODESIZE;
  255.    255                          if (insertPos==0)
  256.    256                          {
  257.    257                                  minval=n->values[0];
  258.    258                                  newval=value;
  259.    259                                  UpdateAncestorNodeMinValue(path,pathindex-1,minval,newval);
  260.    260                          }
  261.    261                          for(i=0;i<insertPos;i++)
  262.    262                          {
  263.    263                                  tmpvalues[i]=n->values[i];
  264.    264                                  tmppointers[i]=n->pointers[i];
  265.    265                          }
  266.    266                          tmpvalues[insertPos]=value;
  267.    267                          tmppointers[insertPos]=pointer;
  268.    268                          for(i=NODESIZE-1;i>=insertPos;i--)
  269.    269                          {
  270.    270                                  tmpvalues[i+1]=n->values[i];
  271.    271                                  tmppointers[i+1]=n->pointers[i];
  272.    272                          }
  273.    273                          for(i=0;i<halfsize;i++)
  274.    274                          {
  275.    275                                  n->values[i]=tmpvalues[i];
  276.    276                                  n->pointers[i]=tmppointers[i];
  277.    277                          }
  278.    278                          n->valuecount=halfsize;
  279.    279                          for(i=halfsize;i<NODESIZE+1;i++)
  280.    280                          {
  281.    281                                  newNode->values[i-halfsize]=tmpvalues[i];
  282.    282                                  newNode->pointers[i-halfsize]=tmppointers[i];
  283.    283                          }
  284.    284                          newNode->pointers[NODESIZE]=n->pointers[NODESIZE];
  285.    285                          n->pointers[NODESIZE]=ni;
  286.    286                          if(inode==path[1]) // if the node is root node
  287.    287                          {
  288.    288                                  pi=GetFreeNode();
  289.    289                                  rootnode=pi;  // change new root node
  290.    290                                  pn=nodes+pi;
  291.    291                                  pn->type=inner;
  292.    292                                  pn->valuecount=1;
  293.    293                                  pn->values[0]=newNode->values[0];
  294.    294                                  pn->pointers[0]=inode;
  295.    295                                  pn->pointers[1]=ni;
  296.    296                          }
  297.    297                          else // 如果这个叶节点不是根节点,那么需要向它的父节点插入值和指针
  298.    298                          {
  299.    299                                  InsertPtToInnerNode(path[pathindex-1],newNode->values[0],ni,path);
  300.    300                          }
  301.    301
  302.    302                  }
  303.    303                  else  // the leaf node has enough space
  304.    304                  {
  305.    305                          for(i=0;i < n->valuecount;i++)
  306.    306                          {
  307.    307                                  if(value < n->values[i])
  308.    308                                  {
  309.    309                                          insertPos=i;
  310.    310                                          break;
  311.    311                                  }
  312.    312                          }
  313.    313                          if(insertPos==-1)
  314.    314                          {
  315.    315                                  insertPos=n->valuecount;
  316.    316                          }
  317.    317                          if(insertPos==0)
  318.    318                          {
  319.    319                                  minval=n->values[0];
  320.    320                                  newval=value;
  321.    321                          }
  322.    322                          for(i=n->valuecount;i>insertPos;i--)
  323.    323                          {
  324.    324                                  n->values[i]=n->values[i-1];
  325.    325                                  n->pointers[i]=n->pointers[i-1];
  326.    326                          }
  327.    327                          n->values[insertPos]=value;
  328.    328                          n->pointers[insertPos]=pointer;
  329.    329                          n->valuecount=n->valuecount+1;
  330.    330                          if(insertPos==0)
  331.    331                          {
  332.    332                                  UpdateAncestorNodeMinValue(path,pathindex-1,minval,newval);
  333.    333                          }
  334.    334                  }
  335.    335          }
  336.    336          return 0;
  337.    337  }
  338.    338

复制代码

论坛徽章:
0
2 [报告]
发表于 2006-12-23 01:59 |只看该作者

  1.    339
  2.    340  int FindNewValueNode(int value,int path[])
  3.    341  {
  4.    342  node* n;
  5.    343  node* root;
  6.    344  int i,ni;
  7.    345          if (rootnode== -1 )
  8.    346                  return -1;
  9.    347          else
  10.    348          {
  11.    349                  path[0]=1;
  12.    350                  path[1]=rootnode;
  13.    351                  root=nodes+rootnode;
  14.    352                  n=root;
  15.    353                  ni=rootnode;
  16.    354                  while(n->type==inner)
  17.    355                  {
  18.    356                          ni=n->pointers[FindValuePtIndex(value,n)];
  19.    357                          n=nodes+ni;
  20.    358                          path[0]=path[0]+1;
  21.    359                          path[path[0]]=ni;
  22.    360                  }
  23.    361                  return ni;
  24.    362          }
  25.    363  }
  26.    364
  27.    365  int FindValuePtIndex(int value,node* n)
  28.    366  {
  29.    367  int count;
  30.    368  int i;
  31.    369          count=n->valuecount;
  32.    370
  33.    371          for(i=0;i<count;i++)
  34.    372          {
  35.    373                  if(value < n->values[i])
  36.    374                          return i;
  37.    375          }
  38.    376          return count;
  39.    377  }
  40.    378
  41.    379
  42.    380  int GetFreeNode()
  43.    381  {
  44.    382  node* n;
  45.    383  int i;
  46.    384          n=nodes+freenode;
  47.    385          i=freenode;
  48.    386          freenode=n->pointers[NODESIZE];
  49.    387          return i;
  50.    388  }
  51.    389
  52.    390  void InsertPtToInnerNode(int index,int value,int pointer, int path[])
  53.    391  {
  54.    392  node* n;
  55.    393  node* newnode;
  56.    394  node* parentnode;
  57.    395  int tmpvalues[NODESIZE+1];
  58.    396  int tmppointers[NODESIZE+1+1];
  59.    397  int halfsize;
  60.    398  int i,j,insertpos,ni,pi; // ni-new node index, pi-parent node index
  61.    399  int pathindex;
  62.    400  int valueinsert; //the value insert to parent node
  63.    401
  64.    402          n=nodes+index;
  65.    403          insertpos=-1;
  66.    404          halfsize=(NODESIZE+1)/2;
  67.    405          if(n->valuecount==NODESIZE) // the node is full, need to split
  68.    406          {
  69.    407                  ni=GetFreeNode();
  70.    408                  newnode=nodes+ni;
  71.    409                  newnode->type=inner;
  72.    410                  for(i=0;i<NODESIZE;i++)
  73.    411                  {
  74.    412                          if(value<n->values[i])
  75.    413                          {
  76.    414                                  insertpos=i;
  77.    415                                  break;
  78.    416                          }
  79.    417                  }
  80.    418                  if(insertpos==-1)
  81.    419                          insertpos=NODESIZE;
  82.    420
  83.    421                  tmppointers[0]=n->pointers[0];
  84.    422                  for(i=0;i<insertpos;i++)
  85.    423                  {
  86.    424                          tmpvalues[i]=n->values[i];
  87.    425                          tmppointers[i+1]=n->pointers[i+1];
  88.    426                  }
  89.    427                  tmpvalues[insertpos]=value;
  90.    428                  tmppointers[insertpos+1]=pointer;
  91.    429                  for(i=insertpos;i<NODESIZE;i++)
  92.    430                  {
  93.    431                          tmpvalues[i+1]=n->values[i];
  94.    432                          tmppointers[i+1+1]=n->pointers[i+1];
  95.    433                  }
  96.    434
  97.    435                  n->valuecount=halfsize;
  98.    436                  for(i=0;i<halfsize;i++)
  99.    437                  {
  100.    438                          n->values[i]=tmpvalues[i];
  101.    439                          n->pointers[i+1]=tmppointers[i+1];
  102.    440                  }
  103.    441
  104.    442                  for(i=halfsize;i<NODESIZE+1;i++)
  105.    443                  {
  106.    444                          newnode->values[i-halfsize]=tmpvalues[i];
  107.    445                          newnode->pointers[i-halfsize]=tmppointers[i+1];
  108.    446                  }
  109.    447                  newnode->valuecount=NODESIZE+1-halfsize; //中间的那个值插入到上级节点
  110.    448                  valueinsert=newnode->values[0];
  111.    449                  for(i=1;i<newnode->valuecount;i++)
  112.    450                  {
  113.    451                          newnode->values[i-1]=newnode->values[i];
  114.    452                  }
  115.    453                  newnode->valuecount=newnode->valuecount-1;
  116.    454
  117.    455                  for(i=1 ;i<=path[0];i++)
  118.    456                  {
  119.    457                          if(index==path[i])
  120.    458                                  pathindex=i;
  121.    459                  }
  122.    460                  if(pathindex==1) // if this inner node is root node
  123.    461                  {
  124.    462                          pi=GetFreeNode();
  125.    463                          rootnode=pi;
  126.    464                          parentnode=nodes+pi;
  127.    465                          parentnode->type=inner;
  128.    466                          parentnode->valuecount=1;
  129.    467                          parentnode->values[0]=valueinsert;
  130.    468                          parentnode->pointers[0]=index;
  131.    469                          parentnode->pointers[1]=ni;
  132.    470                  }
  133.    471                  else
  134.    472                          InsertPtToInnerNode(path[pathindex-1],valueinsert,ni,path);
  135.    473          }
  136.    474          else // if the node doesn't need to split
  137.    475          {
  138.    476                  for(i=0;i< n->valuecount;i++)
  139.    477                  {
  140.    478                          if (value < n->values[i])
  141.    479                          {
  142.    480                                  insertpos=i;
  143.    481                                  break;
  144.    482                          }
  145.    483                  }
  146.    484                  if(insertpos==-1)
  147.    485                          insertpos=n->valuecount;
  148.    486
  149.    487                  for(i=n->valuecount;i > insertpos;i--)
  150.    488                  {
  151.    489                          n->values[i]=n->values[i-1];
  152.    490                          n->pointers[i+1]=n->pointers[i];
  153.    491                  }
  154.    492                  n->values[insertpos]=value;
  155.    493                  n->pointers[insertpos+1]=pointer;
  156.    494                  n->valuecount=n->valuecount+1;
  157.    495          }
  158.    496  }
  159.    497
  160.    498  void PrintBtree()
  161.    499  {
  162.    500          LoadBtree();
  163.    501          printf("BTree: Root:%d \n\n",rootnode);
  164.    502          if(rootnode!=-1)
  165.    503                  PrintNode(rootnode);
  166.    504  }
  167.    505

复制代码

论坛徽章:
0
3 [报告]
发表于 2006-12-23 02:00 |只看该作者

code section 3


  1.    506  void PrintNode(int index)
  2.    507  {
  3.    508  node* n;
  4.    509  int i;
  5.    510          n=nodes+index;
  6.    511          if(n->type==inner)
  7.    512                  printf("NodeIndex:%d ValueCount:%d, type:InnerNode\n",index,n->valuecount);
  8.    513          else
  9.    514                  printf("NodeIndex:%d ValueCount:%d, type:LeafNode\n",index,n->valuecount);
  10.    515          if (n->type==leaf)
  11.    516                  printf("Values:   ");
  12.    517          else
  13.    518                  printf("Values:      ");
  14.    519          for(i=0;i< n->valuecount;i++)
  15.    520                  printf("  %4d  ",n->values[i]);
  16.    521          printf("\n");
  17.    522          printf("Pointers: ");
  18.    523          if(n->type==inner)
  19.    524          {
  20.    525                  for(i=0;i< n->valuecount+1;i++)
  21.    526                          printf("  %4d  ",n->pointers[i]);
  22.    527          }
  23.    528          else
  24.    529          {
  25.    530                  for(i=0;i< n->valuecount;i++)
  26.    531                          printf("  %4d  ",n->pointers[i]);
  27.    532                  printf("next:%d",n->pointers[NODESIZE]);
  28.    533          }
  29.    534
  30.    535          printf("\n\n");
  31.    536          if( n->type == inner)
  32.    537          {
  33.    538                  for(i=0;i< n->valuecount+1 ;i++)
  34.    539                          PrintNode(n->pointers[i]);
  35.    540          }
  36.    541  }
  37.    542
  38.    543  void test()
  39.    544  {
  40.    545  int i,j;
  41.    546  int ni;
  42.    547  int minval;
  43.    548  node* n;
  44.    549  int values[100];
  45.    550  valuelocation v;
  46.    551  int valuecount;
  47.    552  int index;
  48.    553  int val;
  49.    554          printf("RAND_MAX:%d\n",RAND_MAX);
  50.    555
  51.    556          LoadBtree();
  52.    557          srand(atoi(GetSysTime()));
  53.    558          //random();
  54.    559          for(i=0;i<100;i++)
  55.    560          {
  56.    561
  57.    562                  while(1)
  58.    563                  {
  59.    564
  60.    565                          val=rand();
  61.    566                          v=FindValue(val);
  62.    567                          if(v.nodeindex==-1)
  63.    568                          {
  64.    569                                  InsertValue(val,val);
  65.    570                                  break;
  66.    571                          }
  67.    572                  }
  68.    573          }
  69.    574          if(VerifyBtree()!=0)
  70.    575                  return ;
  71.    576          WriteBtree();
  72.    577
  73.    578
  74.    579          minval=MinValueThroughNode(rootnode);
  75.    580          v=FindValue(minval);
  76.    581          ni=v.nodeindex;
  77.    582          n=nodes+ni;
  78.    583          i=0;
  79.    584          printf("values: \n");
  80.    585          while(n!=NULL)
  81.    586          {
  82.    587                  for(j=0;j<n->valuecount;j++)
  83.    588                  {
  84.    589                          values[i]=n->values[j];
  85.    590                          printf("value %d is %d\n",i,values[i]);
  86.    591                          i++;
  87.    592                  }
  88.    593
  89.    594                  if(n->pointers[NODESIZE]==-1)
  90.    595                          n=NULL;
  91.    596                  else
  92.    597                          n=nodes+n->pointers[NODESIZE];
  93.    598          }
  94.    599          printf("\n");
  95.    600          //begin to delete
  96.    601          valuecount=100;
  97.    602          while(valuecount>10)
  98.    603          {
  99.    604                  i=random();
  100.    605                  i=rand();
  101.    606                  index=i/(RAND_MAX/valuecount);
  102.    607                  if(index>valuecount-1)
  103.    608                          continue;
  104.    609                  v=FindValue(values[index]);
  105.    610                  if(v.nodeindex==-1)
  106.    611                  {
  107.    612                          printf("value %d not in btree.\n",values[index]);
  108.    613                          return ;
  109.    614                  }
  110.    615                  printf("Delete %d value:%d\n",index,values[index]);
  111.    616                  if(DeleteValue(values[index])!=0)
  112.    617                  {
  113.    618                          printf("delete value failed\n");
  114.    619                          return ;
  115.    620                  }/*
  116.    621                  v=FindValue(32085);
  117.    622                  if(v.nodeindex==-1)
  118.    623                  {
  119.    624                          printf("value %d not in btree.\n",32085);
  120.    625                          return ;
  121.    626                  }*/
  122.    627
  123.    628                  for(i=index;i<valuecount-1;i++)
  124.    629                          values[i]=values[i+1];
  125.    630                  if(VerifyBtree()!=0)
  126.    631                          return;
  127.    632                  WriteBtree();
  128.    633                  valuecount--;
  129.    634
  130.    635          }
  131.    636          WriteBtree();
  132.    637  }
  133.    638
  134.    639  valuelocation FindValue(int value)
  135.    640  {
  136.    641  int i,vi;
  137.    642  node* n;
  138.    643  int path[101];
  139.    644  valuelocation v;
  140.    645          v.nodeindex=-1;
  141.    646          vi=FindNewValueNode(value,path);
  142.    647          if(vi==-1)
  143.    648          {
  144.    649                  return v;
  145.    650          }
  146.    651          else
  147.    652          {
  148.    653                  n=nodes+vi;
  149.    654                  for(i=0;i<n->valuecount;i++)
  150.    655                  {
  151.    656                          if(n->values[i]==value)
  152.    657                          {
  153.    658                                  v.nodeindex=vi;
  154.    659                                  v.valueindex=i;
  155.    660                                  v.pointer=n->pointers[i];
  156.    661                                  return v;
  157.    662                          }
  158.    663                  }
  159.    664                  return v;
  160.    665          }
  161.    666  }
  162.    667
  163.    668  int DeleteValue(int value)
  164.    669  {
  165.    670  int i,j,ni,pi,bi; //ni - node index;  pi - parent node index ; bi - borther node index
  166.    671  int vi ; // vi - value index int he pointers array
  167.    672  int halfsize=(NODESIZE+1)/2;
  168.    673  int minval,pminval,nminval;
  169.    674  int newval;
  170.    675  int valuepos;
  171.    676
  172.    677  node* n;
  173.    678  node* pn; // parent node
  174.    679  node* prenode=NULL; // previous brother node
  175.    680  node* nextnode=NULL; //next brother node
  176.    681
  177.    682  // 本节点和前一个兄弟节点还是和后一个兄弟节点发生关系(借值或合并) P ,N
  178.    683  char  NodeProc; // P - previous node N- next node
  179.    684  char  MethodProc; // M-merge B-borrow
  180.    685  int path[101];
  181.    686  valuelocation v;
  182.    687
  183.    688          ni=FindNewValueNode(value,path);
  184.    689          if( ni==-1)
  185.    690          {
  186.    691                  return 1;
  187.    692          }
  188.    693          else
  189.    694          {
  190.    695                  n=nodes+ni;
  191.    696                  valuepos=-1;
  192.    697                  for(i=0;i<n->valuecount;i++)
  193.    698                  {
  194.    699                          if(value==n->values[i])
  195.    700                          {
  196.    701                                  valuepos=i;
  197.    702                                  break;
  198.    703                          }
  199.    704                  }
  200.    705                  if(valuepos==-1)
  201.    706                          return 1;
  202.    707                  if(n->valuecount > halfsize) // the node have enough value
  203.    708                  {
  204.    709                          if(value==n->values[0]) // 如果删掉的这个值是这个节点的最小值,那么需要update 他的某个父节点的值
  205.    710                          {
  206.    711                                  minval=n->values[0];
  207.    712                                  newval=n->values[1];
  208.    713                                  if(path[0]!=1) // if this node is not root node
  209.    714                                          UpdateAncestorNodeMinValue(path,path[0]-1,minval,newval);
  210.    715                          }
  211.    716                          DeleteValueInLeafNode(n,value);
  212.    717                          return 0;
  213.    718                  }
  214.    719                  else// if the node doesn't have enough values;
  215.    720                  {
  216.    721                          vi=FindNodeValueIndex(value,n);
  217.    722                          if(path[0]==1) // this leaf node is root node
  218.    723                          {
  219.    724                                  DeleteValueInLeafNode(n,value);
  220.    725                                  if(n->valuecount==0)
  221.    726                                  {
  222.    727                                          ReleaseNode(ni);
  223.    728                                          rootnode=-1;
  224.    729                                  }
  225.    730                                  return 0;
  226.    731                          }
  227.    732                          else  // if the node is not root node
  228.    733                          {
  229.    734
  230.    735                                  pi=path[path[0]-1];
  231.    736                                  pn=nodes+pi; // get parent node
  232.    737                                  for(i=0 ;i<NODESIZE+1;i++)
  233.    738                                  {
  234.    739                                          if(pn->pointers[i]==ni)
  235.    740                                          {
  236.    741                                                  if(i!=0)
  237.    742                                                  {
  238.    743                                                          bi=pn->pointers[i-1];
  239.    744                                                          prenode=nodes+pn->pointers[i-1];
  240.    745                                                  }
  241.    746                                                  if(i!=NODESIZE)
  242.    747                                                  {
  243.    748                                                          bi=pn->pointers[i+1];
  244.    749                                                          nextnode=nodes+pn->pointers[i+1];
  245.    750                                                  }
  246.    751                                                  break;
  247.    752                                          }
  248.    753                                  }
  249.    754                                  if(prenode!=NULL)
  250.    755                                  {
  251.    756                                          NodeProc='P';
  252.    757                                          if(prenode->valuecount > halfsize)
  253.    758                                                  MethodProc='B';
  254.    759                                          else
  255.    760                                                  MethodProc='M';
  256.    761                                  }
  257.    762                                  else
  258.    763                                  {
  259.    764                                          NodeProc='N';
  260.    765                                          if(nextnode->valuecount > halfsize)
  261.    766                                                  MethodProc='B';
  262.    767                                          else
  263.    768                                                  MethodProc='M';
  264.    769                                  }
  265.    770                                  //printf("NodeProc: %c ,MethodProc:%c\n",NodeProc,MethodProc);
  266.    771                                  if(MethodProc=='B') //如果需要借值
  267.    772                                  {
  268.    773                                          if(NodeProc=='P') //如果从前一个节点借
  269.    774                                          {
  270.    775                                                  if(value==n->values[0])
  271.    776                                                  {
  272.    777                                                          minval=value;
  273.    778                                                          newval=n->values[1];
  274.    779                                                          UpdateAncestorNodeMinValue(path,path[0]-1,minval,newval);
  275.    780                                                  }
  276.    781                                                  DeleteValueInLeafNode(n,value);
  277.    782
  278.    783                                                  for(i=n->valuecount ; i>=1 ;i--)
  279.    784                                                  {
  280.    785                                                          n->values[i]=n->values[i-1];
  281.    786                                                          n->pointers[i]=n->pointers[i-1];
  282.    787                                                  }
  283.    788                                                  minval=n->values[0];
  284.    789                                                  newval=prenode->values[prenode->valuecount-1];
  285.    790                                                  n->values[0]=prenode->values[prenode->valuecount-1];
  286.    791                                                  n->pointers[0]=prenode->pointers[prenode->valuecount-1];
  287.    792                                                  n->valuecount=n->valuecount+1;
  288.    793                                                  UpdateAncestorNodeMinValue(path,path[0]-1,minval,newval);
  289.    794                                                  prenode->valuecount=prenode->valuecount-1;
  290.    795                                          }
  291.    796                                          else  //如果需要从后一个节点借
  292.    797                                          {
  293.    798                                                  if(value==n->values[0]) //如果这个删除的最小值
  294.    799                                                  {
  295.    800                                                          newval=n->values[1];
  296.    801                                                          UpdateAncestorNodeMinValue(path,path[0]-1,value,newval);
  297.    802                                                  }
  298.    803                                                  DeleteValueInLeafNode(n,value);
  299.    804
  300.    805                                                  //处理下一个节点
  301.    806                                                  minval=nextnode->values[0];
  302.    807                                                  newval=nextnode->values[1];
  303.    808                                                  n->values[n->valuecount]=nextnode->values[0];
  304.    809                                                  n->pointers[n->valuecount]=nextnode->pointers[0];
  305.    810                                                  n->valuecount=n->valuecount+1;
  306.    811                                                  DeleteValueInLeafNode(nextnode,minval);
  307.    812                                                  UpdateAncestorNodeMinValue(path,path[0]-1,minval,newval);// 下一个节点的最小值也改变了,所以需要也update 父节点
  308.    813                                          }
  309.    814                                          return 0;
  310.    815                                  }
  311.    816                                  else //如果合并节点
  312.    817                                  {
  313.    818                                          if(NodeProc=='P') // 如果和前一个节点合并
  314.    819                                          {
  315.    820                                                  if(value==n->values[0])
  316.    821                                                  {
  317.    822                                                          newval=n->values[1];
  318.    823                                                          UpdateAncestorNodeMinValue(path,path[0]-1,value,newval);
  319.    824                                                  }
  320.    825                                                  DeleteValueInLeafNode(n,value);
  321.    826                                                  minval=n->values[0];
  322.    827                                                  for(i=0;i<n->valuecount;i++)
  323.    828                                                  {
  324.    829                                                          prenode->values[halfsize+i]=n->values[i];
  325.    830                                                          prenode->pointers[halfsize+i]=n->pointers[i];
  326.    831                                                  }
  327.    832                                                  prenode->pointers[NODESIZE]=n->pointers[NODESIZE];
  328.    833                                                  prenode->valuecount=halfsize*2-1;
  329.    834                                                  DeletePtInnerNode(pi,minval,ni,path);
  330.    835                                                  ReleaseNode(ni);
  331.    836                                          }
  332.    837                                          else //如果和后一个节点合并
  333.    838                                          {
  334.    839                                                  if(value==n->values[0])
  335.    840                                                  {
  336.    841                                                          minval=n->values[1];
  337.    842                                                          UpdateAncestorNodeMinValue(path,path[0]-1,value,minval);
  338.    843                                                  }
  339.    844                                                  DeleteValueInLeafNode(n,value);
  340.    845                                                  n->pointers[NODESIZE]=nextnode->pointers[NODESIZE];
  341.    846                                                  n->valuecount=halfsize*2 -1;
  342.    847
  343.    848                                                  minval=nextnode->values[0];
  344.    849                                                  for(i=0;i<halfsize;i++)
  345.    850                                                  {
  346.    851                                                          n->values[halfsize-1+i]=nextnode->values[i];
  347.    852                                                          n->pointers[halfsize-1+i]=nextnode->pointers[i];
  348.    853                                                  }
  349.    854                                                  DeletePtInnerNode(pi,minval,bi,path);
  350.    855                                                  ReleaseNode(bi);
  351.    856                                          }
  352.    857                                  }
  353.    858                                  return 0;
  354.    859                          }
  355.    860                  }
  356.    861          }
  357.    862  }

复制代码

论坛徽章:
0
4 [报告]
发表于 2006-12-23 02:02 |只看该作者

code section 4


  1.    863
  2.    864  /* 从一个中间节点中删除指针 */
  3.    865  void DeletePtInnerNode(int index,int minvalue,int pointer,int path[])
  4.    866  {
  5.    867  int i,pi;
  6.    868  int preindex,nextindex,parentindex;
  7.    869  node* pn;
  8.    870  node* prenode=NULL;
  9.    871  node* nextnode=NULL;
  10.    872  char NodeProc,MethodProc;
  11.    873  int ptpos;
  12.    874  int newval;
  13.    875  node* n;
  14.    876  int minval;
  15.    877  int halfsize=(NODESIZE+1)/2;
  16.    878  int val;
  17.    879
  18.    880          parentindex=-1;
  19.    881          nextindex=-1;
  20.    882          preindex=-1;
  21.    883          n=nodes+index;
  22.    884          if(index==path[1]) //如果这个中间节点是根节点
  23.    885          {
  24.    886                  if(n->valuecount==1)
  25.    887                  {
  26.    888                          ReleaseNode(index);
  27.    889                          if(pointer==n->pointers[1])
  28.    890                                  rootnode=n->pointers[0];
  29.    891                          else
  30.    892                                  rootnode=n->pointers[1];
  31.    893                  }
  32.    894                  else
  33.    895                  {
  34.    896                          DeletePointerInInnerNode(n,-1,path,pointer,minvalue);
  35.    897                  }
  36.    898          }
  37.    899          else //如果是中间节点
  38.    900          {
  39.    901                  parentindex=path[GetPosInAccessPath(index,path)-1];
  40.    902                  if(n->valuecount+1>halfsize) //如果这个节点有足够的指针
  41.    903                  {
  42.    904                          DeletePointerInInnerNode(n,parentindex,path,pointer,minvalue);
  43.    905                  }
  44.    906                  else //如果这个节点的指针不够,需要 借 或 合并
  45.    907                  {
  46.    908
  47.    909                          pn=nodes+parentindex;
  48.    910                          for(i=0;i<pn->valuecount+1;i++)
  49.    911                          {
  50.    912                                  if(pn->pointers[i]==index)
  51.    913                                  {
  52.    914                                          ptpos=i;
  53.    915                                          break;
  54.    916                                  }
  55.    917                          }
  56.    918                          if(ptpos==0)
  57.    919                          {
  58.    920                                  NodeProc='N';
  59.    921                                  nextindex=pn->pointers[1];
  60.    922                                  nextnode=nodes+nextindex;
  61.    923                          }
  62.    924                          else
  63.    925                          {
  64.    926                                  NodeProc='P';
  65.    927                                  preindex=pn->pointers[ptpos-1];
  66.    928                                  prenode=nodes+preindex;
  67.    929                          }
  68.    930                          if(NodeProc=='P')  // previous brother node
  69.    931                          {
  70.    932                                  if(prenode->valuecount > (halfsize-1)) // 借指针
  71.    933                                  {
  72.    934                                          DeletePointerInInnerNode(n,parentindex,path,pointer,minvalue);
  73.    935                                          minval=MinValueThroughNode(n->pointers[0]);
  74.    936                                          for(i=n->valuecount-1;i>=0 ;i--)
  75.    937                                          {
  76.    938                                                  n->values[i+1]=n->values[i];
  77.    939                                                  n->pointers[i+1+1]=n->pointers[i+1];
  78.    940                                          }
  79.    941                                          n->pointers[1]=n->pointers[0];
  80.    942
  81.    943                                          n->values[0]=minval;
  82.    944                                          newval=prenode->values[prenode->valuecount-1];
  83.    945                                          n->pointers[0]=prenode->pointers[prenode->valuecount];
  84.    946                                          prenode->valuecount=prenode->valuecount-1;
  85.    947                                          n->valuecount=n->valuecount+1;
  86.    948                                          UpdateAncestorNodeMinValue(path,GetPosInAccessPath(index,path)-1,minval,newval);
  87.    949                                  }
  88.    950                                  else// 合并
  89.    951                                  {
  90.    952                                          DeletePointerInInnerNode(n,parentindex,path,pointer,minvalue);
  91.    953                                          minval=MinValueThroughNode(n->pointers[0]);
  92.    954                                          DeletePtInnerNode(parentindex,minval,index,path);
  93.    955                                          for(i=0;i<=n->valuecount;i++)
  94.    956                                          {
  95.    957                                                  if(i==0)
  96.    958                                                          val=minval;
  97.    959                                                  else
  98.    960                                                          val=n->values[i-1];
  99.    961
  100.    962                                                  prenode->values[prenode->valuecount + i]=val;
  101.    963                                                  prenode->pointers[prenode->valuecount+i+1]=n->pointers[i];
  102.    964                                          }
  103.    965                                          prenode->valuecount=prenode->valuecount+n->valuecount+1;
  104.    966                                          ReleaseNode(index);
  105.    967                                  }
  106.    968                          }
  107.    969                          else // next brother node
  108.    970                          {
  109.    971                                  if(nextnode->valuecount > (halfsize-1)) // 借节点
  110.    972                                  {
  111.    973                                          DeletePointerInInnerNode(n,parentindex,path,pointer,minvalue);
  112.    974                                          minval=MinValueThroughNode(nextnode->pointers[0]);
  113.    975                                          n->values[n->valuecount]=minval;
  114.    976                                          n->pointers[n->valuecount+1]=nextnode->pointers[0];
  115.    977                                          n->valuecount=n->valuecount+1;
  116.    978                                          DeletePointerInInnerNode(nextnode,parentindex,path,nextnode->pointers[0],minval);
  117.    979                                  }
  118.    980                                  else // 合并节点
  119.    981                                  {
  120.    982                                          DeletePointerInInnerNode(n,parentindex,path,pointer,minvalue);
  121.    983                                          minval=MinValueThroughNode(nextnode->pointers[0]);
  122.    984                                          for(i=0;i<=nextnode->valuecount;i++)
  123.    985                                          {
  124.    986                                                  if(i==0)
  125.    987                                                          val=minval;
  126.    988                                                  else
  127.    989                                                          val=nextnode->values[i-1];
  128.    990                                                  n->values[n->valuecount+i]=val;
  129.    991                                                  n->pointers[n->valuecount+i+1]=nextnode->pointers[i];
  130.    992                                          }
  131.    993                                          n->valuecount=n->valuecount+nextnode->valuecount+1;
  132.    994                                          DeletePtInnerNode(parentindex,minval,nextindex,path);
  133.    995                                          ReleaseNode(nextindex);
  134.    996                                  }
  135.    997                          }
  136.    998                  }
  137.    999          }
  138.   1000  }
  139.   1001
  140.   1002  int FindNodeValueIndex(int value, node* n)
  141.   1003  {
  142.   1004  int i;
  143.   1005          for(i=0;i<n->valuecount;i++)
  144.   1006          {
  145.   1007                  if(n->values[i]==value)
  146.   1008                          return i;
  147.   1009          }
  148.   1010          return -1;
  149.   1011  }
  150.   1012
  151.   1013  int ReleaseNode(int index)
  152.   1014  {
  153.   1015  node* n;
  154.   1016          n=nodes+index;
  155.   1017          n->pointers[NODESIZE]=freenode;
  156.   1018          freenode=index;
  157.   1019  }
  158.   1020
  159.   1021  void DeleteValueInLeafNode(node* n,int value)
  160.   1022  {
  161.   1023  int i;
  162.   1024  int vi;
  163.   1025
  164.   1026          for(i=0 ;i< n->valuecount;i++)
  165.   1027          {
  166.   1028                  if(n->values[i]==value)
  167.   1029                  {
  168.   1030                          vi=i;
  169.   1031                          break;
  170.   1032                  }
  171.   1033          }
  172.   1034          for(i=vi;i<n->valuecount-1;i++)
  173.   1035          {
  174.   1036                  n->values[i]=n->values[i+1];
  175.   1037                  n->pointers[i]=n->pointers[i+1];
  176.   1038          }
  177.   1039          n->valuecount=n->valuecount-1;
  178.   1040  }
  179.   1041
  180.   1042
  181.   1043  void UpdateAncestorNodeMinValue(int path[],int posstart,int val,int newval)
  182.   1044  {
  183.   1045  int i,j;
  184.   1046  node* n;
  185.   1047          for(i=posstart;i>=1;i--)
  186.   1048          {
  187.   1049                  n=nodes+path[i];
  188.   1050                  for(j=0;j<n->valuecount;j++)
  189.   1051                  {
  190.   1052                          if(n->values[j]==val)
  191.   1053                          {
  192.   1054                                  n->values[j]=newval;
  193.   1055                                  return;
  194.   1056                          }
  195.   1057                  }
  196.   1058          }
  197.   1059  }
  198.   1060
  199.   1061  int MinValueThroughNode(int index)
  200.   1062  {
  201.   1063  node* n;
  202.   1064  int mi;
  203.   1065          n=nodes+index;
  204.   1066          if(n->type==inner)
  205.   1067                  mi=MinValueThroughNode(n->pointers[0]);
  206.   1068          else
  207.   1069                  mi=n->values[0];
  208.   1070          return mi;
  209.   1071  }
  210.   1072
  211.   1073  int GetPosInAccessPath(int index , int path[])
  212.   1074  {
  213.   1075  int i;
  214.   1076          for(i=1 ;i<=path[0];i++)
  215.   1077          {
  216.   1078                  if(index==path[i])
  217.   1079                          return i;
  218.   1080          }
  219.   1081          return -1;
  220.   1082
  221.   1083  }
  222.   1084
  223.   1085  void DeletePointerInInnerNode(node* n,int parentindex, int path[], int pointer,int minvalue)
  224.   1086  {
  225.   1087  int i;
  226.   1088  int pos;
  227.   1089  int newval;
  228.   1090          pos=-1;
  229.   1091          for(i=0;i< n->valuecount+1;i++)
  230.   1092          {
  231.   1093                  if(n->pointers[i]==pointer)
  232.   1094                  {
  233.   1095                          pos=i;
  234.   1096                          break;
  235.   1097                  }
  236.   1098          }
  237.   1099          if(pos==-1)
  238.   1100                  return;
  239.   1101
  240.   1102          if(pos==0)
  241.   1103          {
  242.   1104                  newval=n->values[0];
  243.   1105                  if(parentindex!=-1) // 如果不是根节点
  244.   1106                  {
  245.   1107                          //printf("update ancestor,index:%d parent level: %d  minval:%d newval:%d\n",index,GetPosInAccessPath(index,path)-1,minvalue,newval);
  246.   1108                          UpdateAncestorNodeMinValue(path,GetPosInAccessPath(parentindex,path),minvalue,newval);
  247.   1109                  }
  248.   1110                  for(i=0;i<n->valuecount-1;i++)
  249.   1111                  {
  250.   1112                          n->values[i]=n->values[i+1];
  251.   1113                          n->pointers[i]=n->pointers[i+1];
  252.   1114                  }
  253.   1115                  n->pointers[n->valuecount-1]=n->pointers[n->valuecount];
  254.   1116                  n->valuecount=n->valuecount-1;
  255.   1117          }
  256.   1118          else
  257.   1119          {
  258.   1120                  for(i=pos-1;i<n->valuecount-1;i++)
  259.   1121                  {
  260.   1122                          n->values[i]=n->values[i+1];
  261.   1123                          n->pointers[i+1]=n->pointers[i+1+1];
  262.   1124                  }
  263.   1125                  n->valuecount=n->valuecount-1;
  264.   1126          }
  265.   1127  }
  266.   1128
  267.   1129  int VerifyNode(int index)
  268.   1130  {
  269.   1131  int i;
  270.   1132  node* n;
  271.   1133  int minval;
  272.   1134          n=nodes+index;
  273.   1135          if(n->type==leaf)
  274.   1136          {
  275.   1137                  for(i=0;i<n->valuecount-1;i++)
  276.   1138                  {
  277.   1139                          if(n->values[i]>= n->values[i+1])
  278.   1140                          {
  279.   1141                                  printf("Leaf node %d verify failed.\n",index);
  280.   1142                                  return 1;
  281.   1143                          }
  282.   1144                  }
  283.   1145                  return 0;
  284.   1146          }
  285.   1147          for(i=0;i<n->valuecount;i++)
  286.   1148          {
  287.   1149                  minval=n->values[i];
  288.   1150                  if(minval!=MinValueThroughNode(n->pointers[i+1]))
  289.   1151                  {
  290.   1152                          printf("node %d ,pointer %d verify failed.\n",index,n->pointers[i+1]);
  291.   1153                          return 1;
  292.   1154                  }
  293.   1155          }
  294.   1156          for(i=0;i<=n->valuecount;i++)
  295.   1157          {
  296.   1158                  if(VerifyNode(n->pointers[i])!=0)
  297.   1159                          return 1;
  298.   1160          }
  299.   1161          return 0;
  300.   1162  }
  301.   1163
  302.   1164  int VerifyBtree()
  303.   1165  {
  304.   1166  int i,ni,minval;
  305.   1167  node* n;
  306.   1168  int path[101];
  307.   1169  int lastvalue;
  308.   1170  int firstvaluefetched;
  309.   1171
  310.   1172          if(rootnode==-1)
  311.   1173          {
  312.   1174                  printf("no value in this btree.\n");
  313.   1175                  return 0;
  314.   1176          }
  315.   1177          if(VerifyNode(rootnode)!=0)
  316.   1178          {
  317.   1179                  printf("Verify Btree failed.\n");
  318.   1180                  return 1;
  319.   1181          }
  320.   1182
  321.   1183          minval=MinValueThroughNode(rootnode);
  322.   1184          ni=FindNewValueNode(minval,path);
  323.   1185          n=nodes+ni;
  324.   1186          firstvaluefetched=0;
  325.   1187          while(n!=NULL)
  326.   1188          {
  327.   1189                  //printf("Verify Leaf Node %d in leaf node chain.\n",ni);
  328.   1190                  for(i=0;i<n->valuecount-1;i++)
  329.   1191                  {
  330.   1192                          if(firstvaluefetched)
  331.   1193                          {
  332.   1194                                  if(n->values[i]<= lastvalue)
  333.   1195                                  {
  334.   1196                                          printf("Verify btree failed. value should keep growing. node %d\n",ni);
  335.   1197                                          return 1;
  336.   1198                                  }
  337.   1199                                  else
  338.   1200                                          lastvalue=n->values[i];
  339.   1201                          }
  340.   1202                          else
  341.   1203                          {
  342.   1204                                  lastvalue=n->values[i];
  343.   1205                                  firstvaluefetched=1;
  344.   1206                          }
  345.   1207
  346.   1208                          if(n->values[i]>= n->values[i+1])
  347.   1209                          {
  348.   1210                                  printf("Leaf node %d verify failed.\n",ni);
  349.   1211                                  return 1;
  350.   1212                          }
  351.   1213                  }
  352.   1214                  ni=n->pointers[NODESIZE];
  353.   1215                  if(ni==-1)
  354.   1216                          n=NULL;
  355.   1217                  else
  356.   1218                          n=nodes+ni;
  357.   1219          }
  358.   1220          printf("Verify Btree success!\n");
  359.   1221          return 0;
  360.   1222  }
  361.   1223
  362.   1224  char *GetSysTime()
  363.   1225  {
  364.   1226      time_t tm;
  365.   1227      static char systime[7];
  366.   1228      
  367.   1229      tm = time(NULL);
  368.   1230      strftime(systime, 7, "%H%M%S", localtime(&tm));
  369.   1231      
  370.   1232      return systime;
  371.   1233  }

复制代码

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
5 [报告]
发表于 2006-12-23 02:14 |只看该作者
顶一把,但是提醒一下,UNIX-like OS下最好不要像CreateBtree这样命名

论坛徽章:
0
6 [报告]
发表于 2006-12-23 02:15 |只看该作者
好奇怪的接口,这个可以实用吗?

论坛徽章:
0
7 [报告]
发表于 2006-12-23 09:41 |只看该作者
原帖由 cjaizss 于 2006-12-23 02:14 发表
顶一把,但是提醒一下,UNIX-like OS下最好不要像CreateBtree这样命名


的确,风格不同。

原帖由 Serenaiad 于 2006-12-23 01:58 发表
一直没有找到实现的代码,前段时间写了一个,数据库里的索引就是用的整个东西实现的


如果不嫌弃的话,看看 BSD 里的实现。

[ 本帖最后由 langue 于 2006-12-23 09:42 编辑 ]

论坛徽章:
0
8 [报告]
发表于 2006-12-25 09:19 |只看该作者
我一只用snort中附带的 二叉树 和 伸展二叉树
现在正努力把他扩充到 AVL树和 红黑树
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP