冒险岛sf 健康 - 可心专栏 - 博客频道 - CSDN.NET[转]B+树的结构和实现代码 - heiyeluren的blog(黑夜路人
     1.治疗肠胃道疾病 由于蜂蜜有杀菌作用,且具有调节肠胃功能,治疗胃及十二指肠溃疡有显著效果,传奇世界私服,同时蜂蜜对结肠炎、习惯性便秘、老人和孕妇便秘及儿童痢疾等都有良好的疗效;     2.治疗呼吸系统疾病 临床经验表明,结核病患者服蜂蜜后,血红蛋白增加,血沉减慢,咳嗽逐渐减轻,食欲增强;     3.治疗肝脏病 蜂蜜治疗肝脏病主要由于它的化学和生物学上的成份所决定,此外也用它来治胆囊病;     ...
/*******************************************************/

/*btrees.c*/
#include
#include
#include
"btrees.h"

btreesearch(typekey,btree);
btreeinsert(typekey,天龙私服,btree);
btreedelete(typekey,btree);
intheight(btree);
intcount(btree);
doublepayload(btree);
btreedeltree(btree);

staticvoidInternalInsert(typekey,btree);
staticvoidInsInNode(btree,int);
staticvoidSplitNode(btree,int);
staticbtreeNewRoot(btree);

staticvoidInternalDelete(typekey,btree);
staticvoidJoinNode(btree,int);
staticvoidMoveLeftNode(btreet,int);
staticvoidMoveRightNode(btreet,蜀门sf,int);
staticvoidDelFromNode(btreet,int);
staticbtreeFreeRoot(btree);

staticbtreedelall(btree);
staticvoidError(int,typekey);

intbtree_disp;/*????????????????е?λ??*/
char*InsValue=NULL;/*??????????????*/
staticintflag;/*??????????*/
staticintbtree_level=0;/*?????????*/
staticintbtree_count=0;/*????????????*/
staticintnode_sum=0;/*?????????????*/
staticintlevel;/*???????????????*/
staticbtreeNewTree;/*????????????????????*/
statictypekeyInsKey;/*???????*/

btreesearch(typekeykey,btreet)
{
inti,j,m;
level
=btree_level-1;
while(level>=0){
for(i=0,j=t->d-1;it->k[m])?(i=m+1):(j=m));
if(key==t->k){
btree_disp
=i;
returnt;
}
if(key>t->k)/*i==t->d-1??п??????*/
i
++;
t
=t->p;
level
--;
}
returnNULL;
}

btreeinsert(typekeykey,btreet)
{
level
=btree_level;
InternalInsert(key,t);
if(flag==1)/*????????????????????????*/
t
=NewRoot(t);/*??????????*/
returnt;
}

voidInternalInsert(typekeykey,btreet)
{
inti,j,sf传奇,m;

level
--;
if(level<0){/*????????????:???????????*/
NewTree
=NULL;/*???????ж????????*/
InsKey
=key;/*??????????????????+????????*/
btree_count
++;
flag
=1;/*????????????????????*/
return;
}
for(i=0,j=t->d-1;it->k[m])?(i=m+1):(j=m));
if(key==t->k){
Error(
1,key);/*???????????*/
flag
=0;
return;
}
if(key>t->k)/*i==t->d-1??п??????*/
i
++;
InternalInsert(key,t
->p);

if(flag==0)
return;
/*??????????????????*/
if(t->d<2*M){/*??????δ??*/
InsInNode(t,i);
/*????+???????????????*/
flag
=0;/*????????????????????+???????????????*/
}
else/*????????????????????????+???????????????*/
SplitNode(t,i);
/*??????????????????+????????????*/
}

/*
*??????????????????????????????
*/
voidInsInNode(btreet,intd)
{
inti;
/*?????д?????????????????????????????*/
for(i=t->d;i>d;i--){
t
->k=t->k[i-1];
t
->v=t->v[i-1];
t
->p[i+1]=t->p;
}
/*????????????*/
t
->k=InsKey;
t
->p[i+1]=NewTree;
t
->v=InsValue;
t
->d++;
}
/*
*?????????????????????????????????????????
*??????????????????????????????
*?????????????????????????????
*/
voidSplitNode(btreet,intd)
{
inti,j;
btreetemp;
typekeytemp_k;
char*temp_v;
/*????????*/
temp
=(btree)malloc(sizeof(node));
/*
*+---+--------+-----+-----+--------+-----+
*0......MM+1......2*M-1
*+---+--------+-----+-----+--------+-----+
*<-M+1-><-M-1->
*/
if(d>M){/*???????????????*/
/*???2*M-1??M+1??M-1?????+????????????????,
*?????????????+???????λ??
*/
for(i=2*M-1,j=M-1;i>=d;i--,j--){
temp
->k[j]=t->k;
temp
->v[j]=t->v;
temp
->p[j+1]=t->p[i+1];
}
for(i=d-1,j=d-M-2;j>=0;i--,j--){
temp
->k[j]=t->k;
temp
->v[j]=t->v;
temp
->p[j+1]=t->p[i+1];
}
/*??????????????????????????????*/
temp
->p[0]=t->p[M+1];
/*???????в???????????*/
temp
->k[d-M-1]=InsKey;
temp
->p[d-M]=NewTree;
temp
->v[d-M-1]=InsValue;
/*??????????????????*/
InsKey
=t->k[M];
InsValue
=t->v[M];

}
else{/*d<=M*/
/*???2*M-1??M??M?????+????????????????*/
for(i=2*M-1,j=M-1;j>=0;i--,j--){
temp
->k[j]=t->k;
temp
->v[j]=t->v;
temp
->p[j+1]=t->p[i+1];
}
if(d==M)/*?????????????м?*/
/*????????????????????????????*/
temp
->p[0]=NewTree;
/*???????????????????????*/
else{/*(d/*????????????????????????????????*/
temp
->p[0]=t->p[M];
/*??????????????????*/
temp_k
=t->k[M-1];
temp_v
=t->v[M-1];
/*?????д?????????????????????????????*/
for(i=M-1;i>d;i--){
t
->k=t->k[i-1];
t
->v=t->v[i-1];
t
->p[i+1]=t->p;
}
/*?????в???????????*/
t
->k[d]=InsKey;
t
->p[d+1]=NewTree;
t
->v[d]=InsValue;
/*??????????????????*/
InsKey
=temp_k;
InsValue
=temp_v;
}
}
t
->d=M;
temp
->d=M;
NewTree
=temp;
node_sum
++;
}

btreedelete(typekeykey,btreet)
{
level
=btree_level;
InternalDelete(key,t);
if(t->d==0)
/*???????????????????????????????
*??????????м?????????????????????????
*/
t
=FreeRoot(t);
returnt;
}

voidInternalDelete(typekeykey,btreet)
{
inti,冒险岛sf,j,m;
btreel,r;
intlvl;

level
--;
if(level<0){
Error(
0,key);/*?????????δ?????????*/
flag
=0;
return;
}
for(i=0,j=t->d-1;it->k[m])?(i=m+1):(j=m));
if(key==t->k){/*?????????*/
if(t->v!=NULL)
free(t
->v);/*????????????*/
if(level==0){/*????????????????λ???????*/
DelFromNode(t,i);
btree_count
--;
flag
=1;
/*??????????????????????*/
return;
}
else{/*?????λ???????*/
lvl
=level-1;
/*????????*/
r
=t->p;
while(lvl>0){
r
=r->p[r->d];
lvl
--;
}
t
->k=r->k[r->d-1];
t
->v=r->v[r->d-1];
r
->v[r->d-1]=NULL;
key
=r->k[r->d-1];
}
}
elseif(key>t->k)/*i==t->d-1??п??????*/
i
++;
InternalDelete(key,t
->p);
/*???????*/
if(flag==0)
return;
if(t->p->d<M){
if(i==t->d)/*???????????з????????*/
i
--;/*?????????????????????*/
l
=t->p;
r
=t->p[i+1];
if(r->d>M)
MoveLeftNode(t,i);
elseif(l->d>M)
MoveRightNode(t,i);
else{
JoinNode(t,i);
/*??????????????????????????*/
return;
}
flag
=0;
/*????????????????????м????????????*/
}
}

/*
*???????????????????????????
*/
voidJoinNode(btreet,intd)
{
btreel,r;
inti,j;
l
=t->p[d];
r
=t->p[d+1];

/*?????????????????????*/
l
->k[l->d]=t->k[d];
l
->v[l->d]=t->v[d];
/*?????????е????м??????????????????*/
for(j=r->d-1,i=l->d+r->d;j>=0;j--,i--){
l
->k=r->k[j];
l
->v=r->v[j];
l
->p=r->p[j];
}
l
->p[l->d+r->d+1]=r->p[r->d];
l
->d+=r->d+1;
/*?????????????*/
free(r);
/*???????????????????????????*/
for(i=d;i<t->d-1;i++){
t
->k=t->k[i+1];
t
->v=t->v[i+1];
t
->p[i+1]=t->p[i+2];
}
t
->d--;
node_sum
--;
}
/*
*??????????????????????????Щ??????????????
*/
voidMoveLeftNode(btreet,intd)
{
btreel,r;
intm;/*??????????*/
inti,j;
l
=t->p[d];
r
=t->p[d+1];
m
=(r->d-l->d)/2;

/*?????????????????????*/
l
->k[l->d]=t->k[d];
l
->v[l->d]=t->v[d];
/*??????????????????????????????????????
*???????????????????m-1????+??????
*/
for(j=m-2,i=l->d+m-1;j>=0;j--,i--){
l
->k=r->k[j];
l
->v=r->v[j];
l
->p=r->p[j];
}
l
->p[l->d+m]=r->p[m-1];
/*?????????????????????????λ????*/
t
->k[d]=r->k[m-1];
t
->v[d]=r->v[m-1];
/*?????????е????м????????????m??λ??*/
r
->p[0]=r->p[m];
for(i=0;id-m;i++){
r
->k=r->k[i+m];
r
->v=r->v[i+m];
r
->p=r->p[i+m];
}
r
->p[r->d-m]=r->p[r->d];
l
->d+=m;
r
->d-=m;
}
/*
*??????????????????????????Щ??????????????
*/
voidMoveRightNode(btreet,intd)
{
btreel,r;
intm;/*??????????*/
inti,j;
l
=t->p[d];
r
=t->p[d+1];

m
=(l->d-r->d)/2;
/*?????????е????м????????????m??λ??*/
r
->p[r->d+m]=r->p[r->d];
for(i=r->d-1;i>=0;i--){
r
->k[i+m]=r->k;
r
->v[i+m]=r->v;
r
->p[i+m]=r->p;
}
/*?????????????????????*/
r
->k[m-1]=t->k[d];
r
->v[m-1]=t->v[d];
/*??????????????????????????????????????*/
r
->p[m-1]=l->p[l->d];
/*???????????????????m-1????+??????*/
for(i=l->d-1,j=m-2;j>=0;j--,i--){
r
->k[j]=l->k;
r
->v[j]=l->v;
r
->p[j]=l->p;
}
/*?????????????????????????λ????*/
t
->k[d]=l->k;
t
->v[d]=l->v;
l
->d-=m;
r
->d+=m;
}
/*
*???????????????????????????????
*/
voidDelFromNode(btreet,intd)
{
inti;
/*?????д?????????????????*/
for(i=d;i<t->d-1;i++){
t
->k=t->k[i+1];
t
->v=t->v[i+1];
}
t
->d--;
}
/*
*?????????????????????????
*/
btreeNewRoot(btreet)
{
btreetemp;
temp
=(btree)malloc(sizeof(node));
temp
->d=1;
temp
->p[0]=t;
temp
->p[1]=NewTree;
temp
->k[0]=InsKey;
temp
->v[0]=InsValue;
btree_level
++;
node_sum
++;
return(temp);
}
/*
*???????????????????????
*/
btreeFreeRoot(btreet)
{
btreetemp;
temp
=t->p[0];
free(t);
btree_level
--;
node_sum
--;
returntemp;
}

voidError(intf,typekeykey)
{
if(f)
printf(
"Btreeserror:Insert%d! ",key);
else
printf(
"Btreeserror:delete%d! ",key);
}

intheight(btreet)
{
returnbtree_level;
}

intcount(btreet)
{
returnbtree_count;
}
doublepayload(btreet)
{
if(node_sum==0)
return1;
return(double)btree_count/(node_sum*(2*M));
}
btreedeltree(btreet)
{
level
=btree_level;
btree_level
=0;
returndelall(t);

}
btreedelall(btreet)
{
inti;
level
--;
if(level>=0){
for(i=0;i<t->d;i++)
if(t->v!=NULL)
free(t
->v);
if(level>0)
for(i=0;i<=t->d;i++)
t
->p=delall(t->p);
free(t);
}
returnNULL;
}

/*endofbtrees.c*/



上一篇: 传奇外传私服 2010年12月存档 - 杨琦(四极管) - 博客频道 - CSDN.NET2007年01月存档 - oRbIt 的专栏 - 博
下一篇:下面没有链接了