B树实现代码

B树代码实现

阶数 :3; 输入:1 2 3 4 5;
代码只验证过10以下数据。有兴趣,最好跟着下面流程看
在这里插入图片描述

#include<stdio.h>
#include<stdlib.h>

typedef struct Value{  //相当于树节点数组下的一个值
    int data;
    struct Node *lchild,*rchild;
    struct Node *parent;
}Value;

typedef struct Node{    //这个相当于树节点,将树节点设置为数组
    int size;
    struct Value *value;
    struct Value *parent;
}Node;

Value *MallocValue(Value *p){
    p=(Value *)malloc(sizeof(Value));
    p->lchild=NULL;
    p->rchild=NULL;
    p->parent=NULL;
    return p;
}

Node *Malloc(Node *p,int n){
        p=(Node *)malloc(sizeof(Node));
        p->value=(Value *)malloc(sizeof(Value)*n);
        p->size=0;
        p->parent=NULL;
        return p;
}

void ComParent(Node *p,Value *e,int n){
    int flag=0;
    if(p->size>=n-1){
        for(int i=0;i<p->size;i++){
            if(e->data<p->value[i].data){
                flag=1;
                Node *s;
                Value *v;
                v=MallocValue(v);
                s=Malloc(s,n);
                for(int j=n-2;j>=i;j--){        //先将值插入
                    p->value[j+1]=p->value[j];
                    }
                e->parent=p;
                p->value[i]=*e;
                p->size++;
                *v=p->value[(n-1)/2];
                p->size--;
                for(int j=0;j<(n-1)/2;j++){
                    s->value[j]=p->value[j];
                    s->value[j].parent=s;
                    s->size++;
                    p->size--;
                }
                s->parent=v;
                v->lchild=s;
                v->rchild=NULL;
                for(int j=(n-1)/2+1;j<=n-1;j++){
                    p->value[j-(n-1)/2-1]=p->value[j];
                }
                if(p->parent!=NULL){
                    ComParent(p->parent->parent,v,n);
                }else{
                    Node *pa;
                    pa=Malloc(pa,n);
                    p->parent=v;
                    v->rchild=p;
                    v->parent=pa;
                    pa->value[0]=*v;
                    pa->size++;
                }
                break;
            }
        }
        if(flag==0){
            Node *s;
            Value *v;
            v=MallocValue(v);
            s=Malloc(s,n);
            e->parent=p;
            p->value[n-1]=*e;
            p->size++;
            *v=p->value[(n-1)/2];
            p->size--;
            for(int j=0;j<(n-1)/2;j++){
                    s->value[j]=p->value[j];
                    s->value[j].parent=s;
                    s->size++;
                    p->size--;
            }
            s->parent=v;
            v->lchild=s;
            v->rchild=NULL;
            for(int j=(n-1)/2+1;j<=n-1;j++){
                p->value[j-(n-1)/2-1]=p->value[j];
            }

            if(p->parent!=NULL){
                ComParent(p->parent->parent,v,n);
            }else{
                Node *pa;
                pa=Malloc(pa,n);
                p->parent=v;
                v->rchild=p;
                v->parent=pa;
                pa->value[0]=*v;
                pa->size++;
            }
        }
    }else{
        for(int i=0;i<p->size;i++){
            if(e->data<p->value[i].data){
                flag=1;
                for(int j=p->size-1;j>=i;j--){
                    p->value[j+1]=p->value[j];
                }
                e->parent=p;
                p->value[i]=*e;
                p->size++;
                break;
            }
        }

        if(flag==0){
                e->parent=p;
                p->value[p->size]=*e;
                p->size++;
        }
    }
}

void RChildCope(Node *p,Value *e,int n){  //对于右孩子需要分离右边数据
        if(e->data>=p->value[p->size-1].data){  //插入值大于最大一个
            if(p->size>=n-1){
                if(p->value[p->size-1].rchild!=NULL){
                    RChildCope(p->value[p->size-1].rchild,e,n);
                }else{
                    //首先将中间值向父节点传,并将小于中间值的独立成一个子节点,成为中间值的左孩子
                    //大于中间值的向左移动,再将值插入
                    //中间传入父节点后再进行类似比较
                    Node *s;
                    Value *v;
                    v=MallocValue(v);
                    s=Malloc(s,n);
                    e->parent=p;
                    p->value[n-1]=*e;
                    p->size++;
                    *v=p->value[(n-1)/2];
                    p->size--;
                    for(int j=(n-1)/2+1;j<n;j++){
                            s->value[j-(n-1)/2-1]=p->value[j];
                            s->value[j].parent=s;
                            s->size++;
                            p->size--;
                    }
                    s->parent=v;
                    v->rchild=s;
                    v->lchild=p;
                    if(p->parent!=NULL){
                        ComParent(p->parent->parent,v,n);
                    }else{
                        Node *pa;
                        pa=Malloc(pa,n);
                        p->parent=v;
                        v->parent=pa;
                        pa->value[0]=*v;
                        pa->size++;
                    }

                }

            }else{
                if(p->value[p->size-1].rchild!=NULL){
                    RChildCope(p->value[p->size-1].rchild,e,n);
                }else{
                    e->parent=p;
                    p->value[p->size]=*e;
                    p->size++;
                }
            }
        }else{
            for(int i=0;i<=p->size-1;i++){
                if(e->data<p->value[i].data){
                    if(p->size>=n-1){
                        if(p->value[p->size-1].lchild!=NULL){
                            Compare(p->value[p->size-1].lchild,e,n);
                            break;
                        }else{
                            Node *s;
                            Value *v;
                            v=MallocValue(v);
                            s=Malloc(s,n);
                            for(int j=n-2;j>=i;j--){        //先将值插入
                                p->value[j+1]=p->value[j];
                                }
                            e->parent=p;
                            p->value[i]=*e;
                            p->size++;
                            *v=p->value[(n-1)/2];
                            p->size--;
                            for(int j=(n-1)/2+1;j<p->size;j++){
                                s->value[j-(n-1)/2-1]=p->value[j];
                                s->value[j-(n-1)/2-1].parent=s;
                                s->size++;
                                p->size--;
                            }
                            s->parent=v;
                            v->rchild=s;
                            v->lchild=p;
                            if(p->parent!=NULL){
                                ComParent(p->parent->parent,v,n);
                                break;
                            }else{
                                Node *pa;
                                pa=Malloc(pa,n);
                                p->parent=v;
                                v->parent=pa;
                                pa->value[0]=*v;
                                pa->size++;
                                break;
                            }



                        }

                    }else{
                        if(p->value[i].lchild!=NULL){
                            Compare(p->value[i].lchild,e,n);
                            break;
                        }else{
                            for(int j=p->size-1;j>=i;j--){
                                p->value[j+1]=p->value[j];
                            }
                            e->parent=p;
                            p->value[i]=*e;
                            p->size++;
                            break;
                        }
                    }
                }
            }

        }

}

void Compare(Node *p,Value *e,int n){
        if(e->data>=p->value[p->size-1].data){  //插入值大于最大一个,最大右子树需要分离右边
            if(p->size>=n-1){
                if(p->value[p->size-1].rchild!=NULL){
                    RChildCope(p->value[p->size-1].rchild,e,n);
                }else{
                    //首先将中间值向父节点传,并将小于中间值的独立成一个子节点,成为中间值的左孩子
                    //大于中间值的向左移动,再将值插入
                    //中间传入父节点后再进行类似比较
                    Node *s;
                    Value *v;
                    v=MallocValue(v);
                    s=Malloc(s,n);
                    e->parent=p;
                    p->value[n-1]=*e;
                    p->size++;
                    *v=p->value[(n-1)/2];
                    p->size--;
                    for(int j=0;j<(n-1)/2;j++){
                            s->value[j]=p->value[j];
                            s->value[j].parent=s;
                            s->size++;
                            p->size--;
                    }
                    s->parent=v;
                    v->lchild=s;
                    v->rchild=p;
                    for(int j=(n-1)/2+1;j<=n-1;j++){
                        p->value[j-(n-1)/2-1]=p->value[j];
                    }

                    if(p->parent!=NULL){
                        ComParent(p->parent->parent,v,n);
                    }else{
                        Node *pa;
                        pa=Malloc(pa,n);
                        p->parent=v;
                        v->parent=pa;
                        pa->value[0]=*v;
                        pa->size++;
                    }

                }

            }else{
                if(p->value[p->size-1].rchild!=NULL){
                    RChildCope(p->value[p->size-1].rchild,e,n);
                }else{
                    e->parent=p;
                    p->value[p->size]=*e;
                    p->size++;
                }
            }
        }else{
            for(int i=0;i<=p->size-1;i++){
                if(e->data<p->value[i].data){
                    if(p->size>=n-1){
                        if(p->value[p->size-1].lchild!=NULL){
                            Compare(p->value[p->size-1].lchild,e,n);
                            break;
                        }else{
                            Node *s;
                            Value *v;
                            v=MallocValue(v);
                            s=Malloc(s,n);
                            for(int j=n-2;j>=i;j--){        //先将值插入
                                p->value[j+1]=p->value[j];
                                }
                            e->parent=p;
                            p->value[i]=*e;
                            p->size++;
                            *v=p->value[(n-1)/2];
                            p->size--;
                            for(int j=0;j<(n-1)/2;j++){
                                s->value[j]=p->value[j];
                                s->value[j].parent=s;
                                s->size++;
                                p->size--;
                            }
                            s->parent=v;
                            v->lchild=s;
                            v->rchild=p;
                            for(int j=(n-1)/2+1;j<=n-1;j++){
                                p->value[j-(n-1)/2-1]=p->value[j];
                            }
                            if(p->parent!=NULL){
                                ComParent(p->parent->parent,v,n);
                                break;
                            }else{
                                Node *pa;
                                pa=Malloc(pa,n);
                                p->parent=v;
                                v->parent=pa;
                                pa->value[0]=*v;
                                pa->size++;
                                break;
                            }



                        }

                    }else{
                        if(p->value[i].lchild!=NULL){
                            Compare(p->value[i].lchild,e,n);
                            break;
                        }else{
                            for(int j=p->size-1;j>=i;j--){
                                p->value[j+1]=p->value[j];
                            }
                            e->parent=p;
                            p->value[i]=*e;
                            p->size++;
                            break;
                        }
                    }
                }
            }

        }

    }

Node *insert(Node *tree,int e,int n){
    Value *v;
    if(tree==NULL){
        tree=Malloc(tree,n);
        tree->size++;
        tree->value[0].data=e;
        tree->value[0].lchild=NULL;
        tree->value[0].rchild=NULL;
        tree->value[0].parent=tree;
        return tree;
    }
    v=MallocValue(v);
    v->data=e;
    Compare(tree,v,n);
    while(tree->parent!=NULL){
        tree=tree->parent->parent;
    }
    return tree;

}

void main(){
    int n,e;
    Node *tree=NULL;
    printf("请输入创建B树的阶数!!");
    scanf("%d",&n);
    printf("请输入数值!!");
    scanf("%d",&e);
    while(e!=999){
        tree=insert(tree,e,n);
        printf("请输入数值!!");
        scanf("%d",&e);
    }
    printf(" %d ",tree->value[0].data);
    printf("%d\n",tree->value[1].data);
 //   printf("%d-->%d-->\n",tree->value[0].rchild->value[0].data);
    printf("%d  ",tree->value[0].lchild->value[0].data);
    printf("%d  ",tree->value[0].rchild->value[0].data);
  //  printf("%d  ",tree->value[0].rchild->value[1].data);
  //  printf("%d  ",tree->value[1].lchild->value[0].data);
  //  printf("%d-->%d\n",tree->value[0].lchild->value[0].data,tree->value[0].lchild->size);
  //  printf("%d-->\n",tree->value[0].lchild->value[1].data);
   // printf("%d-->\n",tree->value[1].lchild->value[0].lchild->value[0].data);
    printf("%d  ",tree->value[1].rchild->value[0].data);
    printf("%d  ",tree->value[1].rchild->value[1].data);
    printf("%d  ",tree->value[1].rchild->value[2].data);
}

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值