int InsertBTree(NodeType **t, datatype x) { int s, finished = false; NodeType *stptr; datatype kx = x; Result *rs; rs = SearchBTree(*t, kx); if (!rs.tag) { stptr = NULL; while (rs.pt && !finished) { Insert(rs.pt, rs.i, kx, elemptr, stptr); if (rs.pt->keynum < m) finished = true; else { s = (m + 1) / 2; kx = rs.pt->key[s]; elemptr = rs.pt->eptr[s]; stptr = split(rs.pt, s); rs.pt = rs.pt->parent; if (rs.pt) rs.i = SearchBTree(rs.pt, kx); } } } if (!finished) { NewRoot(*t, stptr, kx, elemptr); finished = true; } }
void main() { BTNode *t=NULL; Result s; int j,n=10; KeyType a[]={4,9,0,1,8,6,3,5,2,7},k; m=3; //3阶B-树 Max=m-1;Min=(m-1)/2; printf("创建一棵%d阶B-树:\n",m); for (j=0;j<n;j++) //创建一棵3阶B-树t { s=SearchBTree(t,a[j]); if (s.tag==0) InsertBTree(t,a[j],s.pt,s.i); printf(" 第%d步,插入%d: ",j+1,a[j]);DispBTree(t);printf("\n"); } printf(" 结果B-树: ");DispBTree(t);printf("\n"); printf("删除操作:\n"); k=8; DeleteBTree(k,t); printf(" 删除%d: ",k); printf("B-树: ");DispBTree(t);printf("\n"); k=1; DeleteBTree(k,t); printf(" 删除%d: ",k); printf("B-树: ");DispBTree(t);printf("\n"); }
void main() { BTNode *t=NULL; Result s; int j,n=20; KeyType a[]={1,2,6,7,11,4,8,13,10,5,17,9,16,20,3,12,14,18,19,15},k; m=5; /*例10.7*/ Max=m-1;Min=(m-1)/2; printf("\n"); printf(" 创建一棵%d阶B-树:\n",m); for (j=0;j<n;j++) /*创建一棵5阶B-树t*/ { s=SearchBTree(t,a[j]); if (s.tag==0) InsertBTree(t,a[j],s.pt,s.i); printf(" 第%d步,插入%d: ",j+1,a[j]);DispBTree(t);printf("\n"); } printf(" 删除操作:\n"); /*例10.8*/ k=8; DeleteBTree(k,t); printf(" 删除%d: ",k); DispBTree(t);printf("\n"); k=16; DeleteBTree(k,t); printf(" 删除%d: ",k); DispBTree(t);printf("\n"); k=15; DeleteBTree(k,t); printf(" 删除%d: ",k); DispBTree(t);printf("\n"); k=4; DeleteBTree(k,t); printf(" 删除%d: ",k); DispBTree(t);printf("\n\n"); }
BTree* SearchBTree(BTree* Root, char* data) // поиск элемента { if(Root != NULL) // если узел не пуст { int compare = strcmp(data, Root->data); // сравнить ключи if(compare == 0) return Root; // элемент найден if(compare < 0) // если искомый ключ меньше ключа текущего узла return SearchBTree(Root->left, data); // продолжаем поиск в левом поддереве if(compare > 0)// если искомый ключ больше ключа текущего узла return SearchBTree(Root->left, data); // продолжаем поиск в правом поддереве } return NULL; // элемент не найден }
int main() { int r[N]= {22,16,41,58,8,11,12,16,17,22,23,31,41,52,58,59,61}; BTree T=NULL; Result s; int i; for(i=0; i<N; i++) { s=SearchBTree(T,r[i]); if(!s.tag) InsertBTree(&T,r[i],s.pt,s.i); } printf("\n请输入待查找记录的关键字: "); scanf("%d",&i); s=SearchBTree(T,i); if(s.tag) print(*(s.pt),s.i); else printf("没找到"); printf("\n"); return 0; }