图书系统b树c语言,B树C语言实现

/*====================*/

| BTree.h |

/*====================*/

#ifndef _BTREE_H_

#define _BTREE_H_

#define NUM 3

#define KeyType int

#define Statusint

typedef struct BTNode {

int keynum;

struct BTNode * parent;

KeyType key[NUM+1];

struct BTNode * ptr[NUM+1];

}BTNode,*BTree;

typedef struct {

BTNode * pt;

int i;

int tag;

}Result;

Result SearchBTree(BTree T, KeyType K);

Status InsertBTree(BTree &T, KeyType K, BTree q, int i);

Status CreateBTree(BTree &T, int size, int *key);

void PrintBTree(BTree T);

#endif

/*===================*/

| Btree.c |

/*===================*/

#include "BTree.h"

#include

#include

#include

Result SearchBTree(BTree T,KeyType k)

{

Result result;

BTree p,pre;

Status found = false;

int i = 1;

p = T;

pre = NULL;

while (p && !found)

{

for(i=1;ikeynum;i++)

{

if (k <= p->key[i])

break;

}

if (k == p->key[i])

found = true;

else

{

pre = p;

p = p->ptr[i-1];

}

}

result.i = i-1;

if(found)

result.pt = p;

else

result.pt = pre;

result.tag = found;

return result;

}

Status InsertBTree(BTree &T,KeyType K, BTree q,int i)

{

int j, s;

KeyType x;

BTree ap, temp;

bool finished = false;

x = K;

ap = NULL;

while (q && !finished)

{

for (j = q->keynum; j > i; j --)

{

q->key[j + 1] = q->key[j];

q->ptr[j + 1] = q->ptr[j];

}

q->key[i + 1] = x;

q->ptr[i + 1] = ap;

q->keynum ++;

if (q->keynum < NUM)

finished = true;

else

{

s = NUM / 2 + 1;

x = q->key[s];

q->keynum = s - 1;

ap = (BTree)malloc(sizeof(BTNode));

assert(ap != NULL);

ap->keynum = NUM - s;

for ( j = 1; j <= NUM - s; j ++)

{

ap->key[j] = q->key[s + j];

ap->ptr[j - 1] = q->ptr[s + j - 1];

if (ap->ptr[j - 1]!= NULL)

ap->ptr[j - 1]->parent = ap;

}

ap->ptr[NUM - s] = q->ptr[NUM];

if (ap->ptr[NUM - s] != NULL)

ap->ptr[j - 1]->parent = ap;

q = q->parent; //向上分裂

if (q) //求出i的值

{

for (j = 1; j <= q->keynum && x > q->key[j]; j ++)

NULL;

ap->parent = q;

i = j - 1;

}

}//else

}//while

if (!finished) //q = NULL;

{

temp = (BTree)malloc(sizeof(BTNode));

assert(temp != NULL);

temp->parent = NULL;

temp->keynum = 1;

temp->key[1] = x;

temp->ptr[0] = T;

temp->ptr[1] = ap;

if (ap != NULL)

ap->parent = temp;

if (T != NULL)

T->parent = temp;

T = temp;

}

return true;

}

Status CreateBTree(BTree &T, int size, int *key)

{

Result result;

int i;

for (i = 0; i < size; i ++)

{

result = SearchBTree(T, key[i]);

if (!result.tag) //需要插入

if (!InsertBTree(T, key[i],result.pt, result.i))

return false;

}

return true;

}

void PrintBTree(BTree T)

{

int front,rear, i, count;

BTree Queue[1000], temp;

front = rear = 0;

Queue[rear ++] = T;

while (front < rear)

{

temp = Queue[front++];

if (temp != NULL)

{

count = 0;

for (i = 0; i <= temp->keynum; i ++)

if (temp->ptr[i] != NULL)

count ++;

printf("[%d]", count);

for ( i = 1; i <= temp->keynum; i ++)

printf("%d ", temp->key[i]);

printf("/n");

for (i = 0; i <= temp->keynum; i ++)

Queue[rear ++] = temp->ptr[i];

}

}

}

//

int main(void)

{

BTree T = NULL;

int key[15] = { 45, 24, 53, 90, 3, 12, 37, 50, 61, 70, 100, 30, 26, 85, 7};

CreateBTree(T, 15, key);

PrintBTree(T);

return 1;

}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值