B-树删除的算法!请教!

六月初六 2003-06-01 12:39:43
谢谢!
...全文
84 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
六月初六 2003-06-01
  • 打赏
  • 举报
回复
/*贴出我的算法 还未调试 差删除函数
*/
#include"stdio.h"
#include"alloc.h"
#include"stdlib.h"
#include"conio.h"
#define NULL 0
#define BOOL int
#define TRUE 1
#define FALSE 0
#define DEPTH int
#define RECORD int
#define M 3
#define KEYTYPE int
#define ERROR 1
typedef struct BTNode
{
int keynum;
struct BTNode *parent;
KEYTYPE key[M+1];
struct BTNode *ptr[M+1];
RECORD *recptr[M+1];
}BTNod,*BTree;
typedef struct
{
BTNode *pt;
int i;
int tag;
}Result;
int Search(BTree T,KEYTYPE K)
{
int i;
for(i=1;(T->key[i]>=K)&&(i<T->keynum);i++);
printf(",%d\t%d\n",i-1,T->key[i-1]);
return i-1;
}
Result SearchBTree(BTree T,KEYTYPE K)
{
BTree p,q;
BOOL found=FALSE;
int i=0;
Result Re;
p=T;
q=NULL;
while(p&&(!found))
{
i=Search(p,K);
if(i>0&&p->key[i]==K)
{
found=TRUE;
}
else
{
q=p;
p=p->ptr[i];
}
}
if(!found)
{
Re.pt=p;
Re.i=i;
Re.tag=(p?1:0);
}
else
{
Re.pt=q;
Re.i=i;
Re.tag=0;
}
return Re;
}
BOOL Insert(BTree T,int i,KEYTYPE K,BTree q)
{
int n;
for(n=T->keynum;n>i;n--)
{
T->key[n]=T->key[n-1];
T->ptr[n]=T->ptr[n-1];
T->recptr[n]=T->recptr[n-1];
}
T->key[i]=K;
T->ptr[i]=q;
T->keynum++;
return TRUE;
}
BOOL split(BTree T,int i,BTree q)
{
int n;
int j;
if(!(q=(BTNode *)malloc(sizeof(BTNode))))exit(ERROR);
q->keynum=0;
j=T->keynum;
for(n=0;i<j;i++,n++)
{
q->key[n]=T->key[i+1];
q->ptr[n]=T->ptr[i+1];
q->recptr[n]=T->recptr[i+1];
q->keynum++;
T->keynum--;
}
q->parent=T->parent;
return TRUE;
}
BTree NewRoot(BTree T,BTree q,KEYTYPE K,BTree ap)
{
if(!(q=(BTNode *)malloc(sizeof(BTNode))))exit(ERROR);
q->keynum=0;
Insert(q,0,0,T);
Insert(q,1,K,ap);
q->parent=NULL;
return q;
}
BTree InsertBTree(BTree T,KEYTYPE K,BTree q,int i)
{
KEYTYPE x=K;
BTree ap=NULL;
BOOL finished=FALSE;
int s;
while(q&&(!finished))
{
Insert(q,i,x,ap);
if(q->keynum<M)
{
finished=TRUE;
}
else
{
s=M/2;
split(q,s,ap);
x=q->key[s+1];
q=q->parent;
if(q)i=Search(q,x);
}
}
if(!finished)T=NewRoot(T,q,x,ap);
return T;
}
BOOL CreateBTree(BTree T)
{
KEYTYPE K;
Result Re;
clrscr();
scanf("%d",&K);
while(K)
{
Re=SearchBTree(T,K);
if(!Re.tag)T=InsertBTree(T,K,Re.pt,Re.i);
else{printf("AAA");}
scanf("%d",&K);
}
return TRUE;
}
BTree InitBTree()
{
return NULL;
}
void printBTree(BTree T)
{
int i;
if(!T)return;
printBTree(T->ptr[0]);
for(i=1;i<T->keynum;i++)
{
printf("%d",T->key[i]);
printBTree(T->ptr[i]);
}
}

void main()
{
BTree T;
T=InitBTree();
CreateBTree(T);
printBTree(T);
}

69,336

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧