From a28833f27ec89456eade6ee4453395c36d409257 Mon Sep 17 00:00:00 2001 From: "Raven G. Duran" Date: Sun, 30 Sep 2012 13:32:21 +0800 Subject: [PATCH 01/13] Working on the insertion Bug --- btree.c | 34 +++++++++++++++++----------------- btree.exe | Bin 26506 -> 26506 bytes 2 files changed, 17 insertions(+), 17 deletions(-) diff --git a/btree.c b/btree.c index 26e9763..e9de62e 100644 --- a/btree.c +++ b/btree.c @@ -1,6 +1,6 @@ #include #include -#define MAX 100 +#define MAX 30 // B-Tree Node Structure struct node { @@ -146,10 +146,12 @@ struct node* insertN(int value,struct node *root,struct node *parent){ if (value == root->value[i]){ // If the value is already inserted printf("Data Already inserted!\n"); break; - } else if ( value > root->value[i] ){ // if value to be inserted is greater, then proceed to next box + } else if ( value > root->value[i]){ // if value to be inserted is greater, then proceed to next box if (root->keys[i+1] != NULL && root->keys[i+1]->keyCount < treeOrder + 1) { - root->keys[i+1] = insertN(value,root->keys[i+1],root); - break; + if ( ( (void*)root->value[i+1] != NULL && value < root->value[i+1] ) || root == tRoot){ + root->keys[i+1] = insertN(value,root->keys[i+1],root); + break; + } else i++; } else i++; continue; @@ -192,24 +194,19 @@ struct node* insertN(int value,struct node *root,struct node *parent){ } for (i = right; i < treeOrder; i++){ // Move all right half data to new LeftHalf Box - rightHalf = insertN(root->value[i],rightHalf,NULL); // pointer arithmethic + rightHalf = insertN(root->value[i],rightHalf,NULL); } - struct node *tempRoot = root; - root = insertN(root->value[mid],parent,parent); + struct node *tempRoot = root; // Temporarily hold old root box + struct node *parentP = root->parent == NULL ? NULL : root->parent->parent; // Parent of the parents + + root->parent = insertN(root->value[mid],root->parent,parentP); if (parent == NULL){ // Special case if splitted is the tRoot (The very Root) leftHalf->parent = root; rightHalf->parent = root; - root->keys[0] = leftHalf; - root->keys[1] = rightHalf; - } else { - for (i = 0; i < tempRoot->parent->keyCount; i++){ - if (tempRoot->parent->keys[i] == tempRoot){ - tempRoot->parent->keys[i] = leftHalf; - tempRoot->parent->keys[i+1] = rightHalf; - } - } + parent->keys[0] = leftHalf; + parent->keys[1] = rightHalf; } // To do : Non special case split and distribute... or if parent has a parent with values @@ -226,6 +223,7 @@ void inOrder(struct node *root){ int i; if (root == NULL) return; else { + //root = root->keys[0]; for (i = 0; i < root->keyCount - 1; i++){ // -1 since left and right key of every data box inOrder(root->keys[i]); printf("~%d~\n",root->value[i]); @@ -234,6 +232,7 @@ void inOrder(struct node *root){ } void levelOrder(struct node *root){ + /** int i; if (root == NULL) return; else { @@ -243,7 +242,7 @@ void levelOrder(struct node *root){ printf(" "); if (root->parent == NULL) printf("\n"); else { - for (i = 0; i < root->parent->keyCount; i++){ // Check if had a right sibling, if none then proceed to next level + for (i = 0; i < root->parent->keyCount - 1; i++){ // Check if had a right sibling, if none then proceed to next level if (root->parent->keys[i] == root){ if (root->parent->keys[i+1] == NULL) printf("\n"); break; @@ -255,5 +254,6 @@ void levelOrder(struct node *root){ levelOrder(root->keys[i]); } } + **/ } diff --git a/btree.exe b/btree.exe index 8a9aab8a6a07451f748a5de0f7d3fba447d62090..185e4099f41b566f064bb9d62246305c507448df 100644 GIT binary patch delta 3966 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 From 1f9018031d42c74c24beb6283414b97dd4411885 Mon Sep 17 00:00:00 2001 From: "Raven G. Duran" Date: Sun, 30 Sep 2012 13:56:33 +0800 Subject: [PATCH 02/13] Minor update to printing --- btree.c | 40 ++++++++++++++++++++-------------------- btree.exe | Bin 26506 -> 26506 bytes 2 files changed, 20 insertions(+), 20 deletions(-) diff --git a/btree.c b/btree.c index e9de62e..d162e64 100644 --- a/btree.c +++ b/btree.c @@ -1,6 +1,6 @@ #include #include -#define MAX 30 +#define MAX 100 // B-Tree Node Structure struct node { @@ -146,12 +146,10 @@ struct node* insertN(int value,struct node *root,struct node *parent){ if (value == root->value[i]){ // If the value is already inserted printf("Data Already inserted!\n"); break; - } else if ( value > root->value[i]){ // if value to be inserted is greater, then proceed to next box + } else if ( value > root->value[i] ){ // if value to be inserted is greater, then proceed to next box if (root->keys[i+1] != NULL && root->keys[i+1]->keyCount < treeOrder + 1) { - if ( ( (void*)root->value[i+1] != NULL && value < root->value[i+1] ) || root == tRoot){ - root->keys[i+1] = insertN(value,root->keys[i+1],root); - break; - } else i++; + root->keys[i+1] = insertN(value,root->keys[i+1],root); + break; } else i++; continue; @@ -194,19 +192,24 @@ struct node* insertN(int value,struct node *root,struct node *parent){ } for (i = right; i < treeOrder; i++){ // Move all right half data to new LeftHalf Box - rightHalf = insertN(root->value[i],rightHalf,NULL); + rightHalf = insertN(root->value[i],rightHalf,NULL); // pointer arithmethic } - struct node *tempRoot = root; // Temporarily hold old root box - struct node *parentP = root->parent == NULL ? NULL : root->parent->parent; // Parent of the parents - - root->parent = insertN(root->value[mid],root->parent,parentP); + struct node *tempRoot = root; + root = insertN(root->value[mid],parent,parent); if (parent == NULL){ // Special case if splitted is the tRoot (The very Root) leftHalf->parent = root; rightHalf->parent = root; - parent->keys[0] = leftHalf; - parent->keys[1] = rightHalf; + root->keys[0] = leftHalf; + root->keys[1] = rightHalf; + } else { + for (i = 0; i < tempRoot->parent->keyCount; i++){ + if (tempRoot->parent->keys[i] == tempRoot){ + tempRoot->parent->keys[i] = leftHalf; + tempRoot->parent->keys[i+1] = rightHalf; + } + } } // To do : Non special case split and distribute... or if parent has a parent with values @@ -223,16 +226,15 @@ void inOrder(struct node *root){ int i; if (root == NULL) return; else { - //root = root->keys[0]; - for (i = 0; i < root->keyCount - 1; i++){ // -1 since left and right key of every data box + //root = root->keys[1]; + for (i = 0; i < root->keyCount; i++){ // -1 since left and right key of every data box inOrder(root->keys[i]); - printf("~%d~\n",root->value[i]); + if (i < root->keyCount - 1) printf("~%d~\n",root->value[i]); } } } void levelOrder(struct node *root){ - /** int i; if (root == NULL) return; else { @@ -242,7 +244,7 @@ void levelOrder(struct node *root){ printf(" "); if (root->parent == NULL) printf("\n"); else { - for (i = 0; i < root->parent->keyCount - 1; i++){ // Check if had a right sibling, if none then proceed to next level + for (i = 0; i < root->parent->keyCount; i++){ // Check if had a right sibling, if none then proceed to next level if (root->parent->keys[i] == root){ if (root->parent->keys[i+1] == NULL) printf("\n"); break; @@ -254,6 +256,4 @@ void levelOrder(struct node *root){ levelOrder(root->keys[i]); } } - **/ } - diff --git a/btree.exe b/btree.exe index 185e4099f41b566f064bb9d62246305c507448df..d19b2f95c0cbc914ccebe0fb1f4a811a56fb9258 100644 GIT binary patch delta 4501 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 delta 4104 zcmZ{ndr(tX8o~(`#wOYl z?&tg*(vD@3iUEvBr7_sAXoq&KCZgk*yfjCO@3Su8f*i z@)#BuK8NmDCpa7s-hjTy>BOsv(Z8v}L9!_%n}f12{z14Yg*~Bv*rV4R?4+Ea@hW1I z#_hxj8lND(gBdZ{4dRH#|0KSl@%P04(AZFl9MX6K@p~HQ68{A`d@Y$>)-NiZj(q-1 zrT=T+t#ph%jbcpIYzxV@MB~N8dC0q!5t^6yJEf(tI>UI+PF#gI%-Xv?L#F>p1_)22 z+p!;`(O3dQJV6i@$Sq_U(wKX_M-JcM`iEN|;I&<|e3iU9@A2A|oQNLXN$f|%!=7?Y zv5$^5S#&%3L+m9z z+BA;PDj!6RUl~y=M^we&msMpXv||_*GX8O)(eE8X4k^Rb#7C%Cd_8iJGTdh6`r(ky ziweznIOO!U(rC9b9EHf|7>-Zt@~3^b93h1Qfp0q-m;6x1I@}(9rFURK0{I$MWyn|T z1=G%LtTZ{plZj;wcrl}@7}d%lRTn5y45rHA5)EhB3sVIlZ1XzOQgba4jZMrOrcb1OLU) zyOp6R49rH6Mmb0#Su429MMbUmRrE87TJOno0^14mv<|4i3R4`l^d?j~UyoQnN2mop z!~Gn|QJ3(Up&C2UEXvIuXnzRpg`y~tme90kJG+|llw6=^*~TL2MYhg3$K${T@hg4& z#UdBb!>?S$yYD1lH}@DGgIL``cfWEmq7Nw-5i$Hlzj9fv!F9aMXOimXMsz;W^4?T+ zUYgD8Bbda;qbTNB=$2_}WxwjdguK_(%05aSW3#IC`^#F@N`yXtS(~a{r8pnqej*Jf zqC$IBrPp`XQN6k*c24-V8=yswxIzl`Ihq=@iF6eyBQNEvl?Loh6}y#UeaaUxn~ShY z?dX_XhEx3(X2H`0d-*hPa3p$7TeJ$AuGc8^*5S^zqjd@ynQGc{M>g$U1-Nlip-wZFi-2+2~B4 zbb;;7%$2UNk25z)VV0LwEB%jkX5~tw*oRpMq;ys@B{#!@$C3?RgwC-Jup=KvHemP? zc67?NsSUA2PIwg>1-HW%b_dAg;;}n;>~%a( z2jCY9^Xz@p<7tX{I$`CXnq{0yPQcH{n zktuNx-SDEX_zpM;w@}{B`5g!&zsC7pxQTp-^9Rt6e2nuc=tDlu`4hN`e2MdUxQtA3 zdoaIPn|>6;t0VTtDy5bt{t}&Sa07N`I6!OT8@#1ajWcwE9{h5`S1?NOO~BulG5Oc% zALnnNfa4@`z6r~OVgQySYqQeN4rFF*sfy{ynfPD4kO=gNLL&DR5{X$;+z7&(p?T-Ml5Gvm?xixDRos#&;a7AG z`)l#9<%>o(zQiiqWHwls&X$+hoa^5`Y9r&qhC)!Dc%GvYm`4&l*5=lW?f5t=&|=elzq6NjwA{ zu5u_)Sm)dzcca8Lqe}_MJ!JAM8=S9aca_ec zhHgT%Vf)KnaZGo)K8JC}17ZY#x2j)V*=Nz`Le~# z0;_mWjI5fGHOT$>-rK~@z#$wd$0wL0+su~NY>)#c_EF7o*=%CZuii7e;y$w%abpg0 j3H{qr+tj>%vwJP Date: Sun, 30 Sep 2012 14:53:08 +0800 Subject: [PATCH 03/13] Partially corrected insertion recurception problem --- btree.c | 34 ++++++++++++++++++++-------------- btree.exe | Bin 26506 -> 26506 bytes 2 files changed, 20 insertions(+), 14 deletions(-) diff --git a/btree.c b/btree.c index d162e64..fa47c51 100644 --- a/btree.c +++ b/btree.c @@ -192,29 +192,35 @@ struct node* insertN(int value,struct node *root,struct node *parent){ } for (i = right; i < treeOrder; i++){ // Move all right half data to new LeftHalf Box - rightHalf = insertN(root->value[i],rightHalf,NULL); // pointer arithmethic + rightHalf = insertN(root->value[i],rightHalf,NULL); } + int pIsNull = parent == NULL ? 1 : 0; struct node *tempRoot = root; - root = insertN(root->value[mid],parent,parent); + struct node *pParent = pIsNull ? NULL : parent->parent; - if (parent == NULL){ // Special case if splitted is the tRoot (The very Root) - leftHalf->parent = root; - rightHalf->parent = root; - root->keys[0] = leftHalf; - root->keys[1] = rightHalf; + parent = insertN(root->value[mid],parent,pParent); + + if (pIsNull){ // Special case if splitted is the tRoot (The very Root) + leftHalf->parent = parent; + rightHalf->parent = parent; + parent->keys[0] = leftHalf; + parent->keys[1] = rightHalf; + + free(tempRoot); // Delete old root node box + return parent; } else { - for (i = 0; i < tempRoot->parent->keyCount; i++){ - if (tempRoot->parent->keys[i] == tempRoot){ - tempRoot->parent->keys[i] = leftHalf; - tempRoot->parent->keys[i+1] = rightHalf; + for (i = 0; i < parent->keyCount; i++){ + if (parent->keys[i] == tempRoot){ + parent->keys[i] = leftHalf; + parent->keys[i+1] = rightHalf; } } + free(tempRoot); + return leftHalf; } // To do : Non special case split and distribute... or if parent has a parent with values - - free(tempRoot); // Delete old root node box } } @@ -226,7 +232,7 @@ void inOrder(struct node *root){ int i; if (root == NULL) return; else { - //root = root->keys[1]; + // root = root->keys[2]; for (i = 0; i < root->keyCount; i++){ // -1 since left and right key of every data box inOrder(root->keys[i]); if (i < root->keyCount - 1) printf("~%d~\n",root->value[i]); diff --git a/btree.exe b/btree.exe index d19b2f95c0cbc914ccebe0fb1f4a811a56fb9258..9da207449e9f0817ef039985b52f11990a7dfeff 100644 GIT binary patch delta 3003 zcmZ{m4N#Nk9l-xj2uZ*Ip|~E1A7Fw=p%{8wM8OgvuZfC~DpUkqKtbyfAY!n+?kE&w z8s0+^{@us5Ye#Q)z3V=%w%P6Ux_MN)fs|ErNImN&+uSuAtiuWF4Q=*+@{(7%+n&3; z|KIcfem?RhJ(pR}W#&DlD46#3lqmA^eK+1?ZhV~$v2on4NN3Oak1B>3o5M}YgUpL> zD>tOo!~t~Qi#u^V7z_rwq5-CyL_OU$jUO}e@Klri z-KyJq;TA=1b`!JkBKX2YCv#q)y41%8&i~?#uh8PSdZ)RO_|nC4&p*0m63PAy&v8WZ-Nb#{ zBrfKBl(<)T$Tuatq!M&!vQ#-_2vnm_lUR0_j*5(}++QulmT_JnePA7byz)&jxL8pW zuJ}7C>LmBPB5^3{_dH-0A88VEPfF?^ahJDglx|IOaT1xpo_jy_J zKaZ=TR%|-I#AKCBp$d7#fkSlF0%sq|ees>hiXh#eaUjac%or1$8ZkQ6i8;|3?0~;2 zdLvUkLkB;djV~?Beo7RyV#j*&&x_>89e4T~USGDG^<$>CyS=MT2XSu<#{Fi{BU~p> zk1*cVb{$${ML{Qa7%0jk3{R_vgkicEAPU1CVN4XpXp=SM5xRioT2Z(yDm(ci71X6i z(D4-RBC&ju`*iXwV)@M{SSJdTo=z`=b~4c9rl<1_`ih9cI8TzH=BV=sqtl0nggL1& zbrV{HF!$OfGK%GM;t4NhfIMNmHAUPN(oohDKCTSUZ_=D+?iJ>OFnw;Zz_5xJn4|)+ z)2h&-M@3<@>r*rK#?-I@{5r;#wU>P8Hc`|S+V1s*bY_-Nn5OG2Ul45(KL)PP!UM4{ zvTJxQ){4PcPf<;(8M+<>-5K43o{R1T&%NH?rt?Jvm%q(TJ6rEjq$`;sNA3lKRaN^h ziZOL$$QkUuG#zagmv`6UXL0LxaA)bwvC2pX$5W<-QpS0E-Ru5Gy2}5T&Y!3IfW?fZ znBg341`HKxI{f$Jvm=sUz7q_3r9p42pq(o6!5MuDZ~xON%;isg`l~2cN*q|D~_EA&n0Lc;=#mPTG zFZ0)sEAtH0$b1J56R!+48o8?$mU zz+KJe4oV0x#wPiMiQNkWVvxJ&*ufiUVS7XGBzQuU1W;+bt*H3!|zEyw7_Vrqq6q0`~Eifsu_`ZDt4q5F5JrJkRU3x8UnUvAcg zkCPu+4u9ju<3zIOE83)SCAGd}id4EaEZ ztl{~GDZdlT_cyRH{A9nMmfrf^zFhATpYN#wjB-~FSIdzm_aPWu;&Y08Xw&l@6>Px& I1IN7jzem|eTL1t6 delta 2826 zcmZ{meN1?p;#Nlk7$C_f*5*SrUmo@35kN53MdLRP{mgH6hlu>R|^Aa z2^o^`tRJVRU2%VOXMgncBm1K}?P;mHF?Ac*a?p0Jvf9?`sIBZEb*Rgp_g-?{|b@t0p-&R#la_EaUnFD{$Mp!3qQf09F!v|F(jGe^w>OHI$ zUstb5w;2F>W(`N4ibNt}SvNRN>lE|2T$M^vw4}Ue; zk7I6ZhVB4m>i&*DHN@Ij2w#hRgcakt*!0C_iWC#*E3m|96Toj0zt@uQ*Vn{}L^Q>% zSo-Tk%Cy)jzDhoRhgBW8UtcFcpwQ@7Tg5+MW!zzwffI3=dAWMZG(o}CAP548&rl?> ziE}e&if;7?T$jOhn@J~95Qv?auQ7EzAp6_6EmP)d&dX%(<(wk(?>K8@zR39|<)OS^ zasEN(>zpsitSuluCvzI-GcvE?{4ufk&jcLTlnD96r%qJ(zv=$YMEM@#Io8X*>$&e1 znM*kr5cfN8@kNPFX(@WOS#gXEVitz9rt%ZCRb*`E{^w*a=X{1(oTV)lpZ-rIGG9>} zt=KPnzQ8??-4*pBj~d3?T9bCCtbQ4{=oanYp$3@JQ}l0ngiAJk#5tF^JKspF4nD&% zF8Q_%+~fa%>@W3|KrGsMU+>>m`r<2*6+^nWa7fq4Y?v6oJZAh#8Ro>VVh@L_;(yBG z=4j)mvhm4;hZdeD3^?_H&Ic(bHc#mN^AXm0{)}E3EBpgOsRA?-4-wOA zAPom`bU5G=&8LN<>B8nYk4?e z4vs7QBb-z?0%sHkHmPs~t}7hFZV}6q{GKM6ibJc77JgZpfvzVSY7%B;?EvQJf0A`3dnB zh5iW?74Av_`l*v!k9vCW?ZSaI#q_(*C@v26wlvohK#ih_dJ6NJ7`B?a+Kn|X4Qs{G zq6Sr~0Vg*uqKRlp;dL~qhDqUGJLn9uF>=_0*NQcG(-~5pe5x_Y17CHyqiAxwRg<#z zr6@id)eLTO<7tN-jho#Vbn39lwHl8S*ShVfFLC1+o9x&}vU0N>wWV&HAo)DW@)A3$ zx47|Bl3gS{rS`$CZv1Ph9iJmvy2XySNS-G7%r-Z=x7zUr$v={O%EP-4IUBI;QJD^4 z)AlBGY@;^H+<2ViQIdj(S}3O$wo?lvE6b>bilEAzOuPTMH1(Jrp*xS-!JR>7#?Vd+ z*VX2(z;}uZw0nFlZHEBX;_^xhpLB6$aY`P&TYOXKob79?=er`{88|x(eV6# zqWpPSQPaSN@ROP_O}+iGfpxX_`20*mj!IYF*0%l4zI_n9$ETNkt{E}UTgh6(FM6+Q F{tN%n8V&#e From d36c118eebf0890fc278edaffd23a3eccb7fea71 Mon Sep 17 00:00:00 2001 From: "Raven G. Duran" Date: Sun, 30 Sep 2012 17:38:51 +0800 Subject: [PATCH 04/13] Updated Insertion Again --- btree.c | 13 +++++++++---- btree.exe | Bin 26506 -> 27018 bytes 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/btree.c b/btree.c index fa47c51..e9a91cd 100644 --- a/btree.c +++ b/btree.c @@ -158,7 +158,10 @@ struct node* insertN(int value,struct node *root,struct node *parent){ root->keys[i] = insertN(value,root->keys[i],root); break; } else { - for (j = treeOrder - 2; j >= i; j--) root->value[j+1] = root->value[j]; // move everything to the right + for (j = treeOrder - 2; j >= i; j--) { + root->value[j+1] = root->value[j]; // move everything to the right + root->keys[j+2] = root->keys[j+1]; + } root->value[i] = value; root->keyCount++; @@ -167,7 +170,7 @@ struct node* insertN(int value,struct node *root,struct node *parent){ } } - } else { // else if the box is null. Insert directly + } else { // else if the box is null or the last box. Insert directly root->value[i] = value; root->keyCount++; @@ -188,11 +191,13 @@ struct node* insertN(int value,struct node *root,struct node *parent){ struct node *rightHalf = NULL; for (i = 0; i <= left; i++){ // Move all left half data to new LeftHalf Box - leftHalf = insertN(root->value[i],leftHalf,NULL); // Set the parent to NULL temporarily + leftHalf = insertN(root->value[i],leftHalf,parent); // Set the parent to NULL temporarily + leftHalf->keys[i] = root->keys[i]; } for (i = right; i < treeOrder; i++){ // Move all right half data to new LeftHalf Box - rightHalf = insertN(root->value[i],rightHalf,NULL); + rightHalf = insertN(root->value[i],rightHalf,parent); + rightHalf->keys[i] = root->keys[i]; } int pIsNull = parent == NULL ? 1 : 0; diff --git a/btree.exe b/btree.exe index 9da207449e9f0817ef039985b52f11990a7dfeff..5ab5e6c3826b15f2b600313dbbe66675c2f4bd21 100644 GIT binary patch delta 3310 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 From 20af300f49b4ec725a6284786e226798dbf3f6c8 Mon Sep 17 00:00:00 2001 From: "Raven G. Duran" Date: Sun, 30 Sep 2012 18:23:08 +0800 Subject: [PATCH 05/13] Starting To Debug 3+ levels --- btree.c | 11 +++++++++-- btree.exe | Bin 27018 -> 27530 bytes 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/btree.c b/btree.c index e9a91cd..8fbe619 100644 --- a/btree.c +++ b/btree.c @@ -71,7 +71,7 @@ void doInsert(){ system("cls"); printf("--- Insertion ---\n"); printf("Value: "); - scanf("%d",&value); + scanf("%d",&value); tRoot = insertN(value,tRoot,NULL); @@ -147,7 +147,8 @@ struct node* insertN(int value,struct node *root,struct node *parent){ printf("Data Already inserted!\n"); break; } else if ( value > root->value[i] ){ // if value to be inserted is greater, then proceed to next box - if (root->keys[i+1] != NULL && root->keys[i+1]->keyCount < treeOrder + 1) { + if (root->keys[i+1] != NULL && root->keys[i+1]->keyCount < treeOrder + 1 && root->value[i+1] > value) { + PUT_RIGHT: root->keys[i+1] = insertN(value,root->keys[i+1],root); break; } else i++; @@ -155,6 +156,7 @@ struct node* insertN(int value,struct node *root,struct node *parent){ continue; } else { // This is if the value to be inserted is lesser which means, we can put it now if (root->keys[i] != NULL && root->keys[i]->keyCount < treeOrder + 1) { + PUT_LEFT: root->keys[i] = insertN(value,root->keys[i],root); break; } else { @@ -171,6 +173,11 @@ struct node* insertN(int value,struct node *root,struct node *parent){ } } else { // else if the box is null or the last box. Insert directly + if (root->keys[i] != NULL && root->keys[i]->keyCount < treeOrder + 1) { + printf("Succes!\n"); + goto PUT_LEFT; + } + root->value[i] = value; root->keyCount++; diff --git a/btree.exe b/btree.exe index 5ab5e6c3826b15f2b600313dbbe66675c2f4bd21..7d195ffbd5f337133d8b45a9a89641d91ec6c86f 100644 GIT binary patch delta 3870 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 W56`@hG*LLGc!nZL*Rs2~+wZ^8SOPWx delta 3779 zcmZ{n3s98T6@brO7Fd^sT?8uv8jwXyRD_OFtvXp?S69J+;o%FzB0eG_8U*VkHK0g! z-4GW}Cz#e4FiqNwX-WcP!B^JDh(=5?8nqfLcFc5*Ho?{?iQ4Ts{|{H4N$$-5pYNV? z?mg$;d-l%1+b)Q0XN7xfhK31P*_+G0(Q5qD`5<6DdXwRer1*ZF)t?^!*-jZ&gctvQH>C7*O=nzi27@V0im zD8N|%VImEu_$Lhdnnu;!(t6WyrGJtL#hw1Y)Ep1Ni~i=QCW`BI(aSa5lw<*Cgtu%E zIbZMf=Ht+SxDg}CwOxe}Z_2=uc447zY`{h`ct5~;T|{oW>R-wJb5+h|&R~~ybY|Z5 z|MU6!BkBes2CJT1*faLAQA2o?1t01nsxHu2a&Kgpo5VHKOtiI7VQgl}XLE)s?52Ty z-e;dq)&CIl{vY+%`#pxZD-Y{V`@j%M6Lj18_7d$BP%U5vxa!4A=dQ$xxFMx>GFAFwSXJ=x5-FhDt5 zAKW}cJ2;wEc2c=)x|((~trRLlNI#bK6v{X!K*7Ibl`(a!`%%m5Fs0LJe04LtZZ8c2 z*Bq@&)Ew4{O?(M#{N9AujLXwoVl7b9=c{LKjO|!thuX(ymv%#5b=JMP~y7ne|@gaE|Gyv^g*c3WFGKq9`l{-3ZJ5#B3 z+L~B6ZSBny8U_!sPaa1PE$f2CI6^u%l+VzY| zq}pFIs==!JgKg$utyN*mG*Jn+eZKw!B|l#i1?R?$p~BJ-5##5HwcxiyhqX?P=8=iN&Y>Yk^B~%m%IxEFO-@U-iBn!&5$B_ zH_Vj$4irdkhIPzU%HVf_e}vqu@E$lN{|Oo-zYlvPe+Yk;{1zkpv!z5q3Ty#Lg! za1maYhD-2<@)bBO`4U`_+ymDoUxRNYd*Pns8}N`gS`Sc-2gk)%b-*pE z*VniY`@l=QL*e~!op`sxhoFa;FYIdg1imCbs_-eeNPI@&E;vVgP2tnfP0VZa&@*uS zJ;VcfFbDE?4)1}vztc;D&2S40krpT=ZX(u^jhmHtpjqJ?pc_|dR=5rH8Pd=HfjG(k zg-MccgG2INSWc{L0Q?)UCo!?A4=QEIzQ;oL^$+6kKRg!l0q{p1H!C~@DM_qtO-}0Oi^tq5ejXYUR!Q3{AOnkWVRRiEB0x>ji7*4Xfg@=5fdg=x*f<9#WGb=1yRkWfE90MABDK*Sr zOP5I~WjF*U*h)3s1|_LuHhXvy{dT#^`2mO}H!{XdAF1gvpmqAZ@M`*&domHSw@fdg z4}z!}apRBEM=ak{0kC9s*;1b3iqs5b?&;U~(Fa0k-U3{d5vb`kQU)a~deS3#^^6XC ziLhW%=ER1XZjp`kGw&bTkTK82BI~Jx9K@M zeriv_*Gal(4#HI#m1LH#Fkm9 zy5fq}R|n+isTxt|!2 zOtp}WUlg!a8XGZ|HI<)pwVlKi^`S};+PlWXpggAxFJk9xo{$#!Ro>| zs$DFMi*J$9$P)tnX;LMO8h=@7<=Ph^2`?AU54R|u%I~SLsI+u-aS?^IJEqe_+Z`*Z z7VbMH##hT6sj%4zx}}B#oS*;)Ft2E(h{3}}t+Yjzi?`40dBW$FK)QrwT7_%MSCmyO g1CtET^K2!bHPVMQZ<5A@vx{eFdQGiw6yFK_Kf|!`jsO4v From 9b40bf899a077abe0f1b5083c8f11d109433b2f6 Mon Sep 17 00:00:00 2001 From: "Raven G. Duran" Date: Sun, 30 Sep 2012 21:37:17 +0800 Subject: [PATCH 06/13] Still on 3+ Levels --- btree.c | 4 ++-- btree.exe | Bin 27530 -> 27530 bytes 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/btree.c b/btree.c index 8fbe619..ece140d 100644 --- a/btree.c +++ b/btree.c @@ -200,12 +200,12 @@ struct node* insertN(int value,struct node *root,struct node *parent){ for (i = 0; i <= left; i++){ // Move all left half data to new LeftHalf Box leftHalf = insertN(root->value[i],leftHalf,parent); // Set the parent to NULL temporarily leftHalf->keys[i] = root->keys[i]; - } + } leftHalf->keys[left+1] = root->keys[left+1]; for (i = right; i < treeOrder; i++){ // Move all right half data to new LeftHalf Box rightHalf = insertN(root->value[i],rightHalf,parent); rightHalf->keys[i] = root->keys[i]; - } + } rightHalf->keys[treeOrder] = root->keys[treeOrder]; int pIsNull = parent == NULL ? 1 : 0; struct node *tempRoot = root; diff --git a/btree.exe b/btree.exe index 7d195ffbd5f337133d8b45a9a89641d91ec6c86f..9d9d876740b4b4cd4def34ff0748ec584f2ea0ab 100644 GIT binary patch delta 2443 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 Date: Sun, 30 Sep 2012 22:35:52 +0800 Subject: [PATCH 07/13] Just a little more bugs for insertion --- btree.c | 11 +++++++++-- btree.exe | Bin 27530 -> 27530 bytes 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/btree.c b/btree.c index ece140d..5901b14 100644 --- a/btree.c +++ b/btree.c @@ -106,7 +106,6 @@ void doInOrder(){ system("cls"); printf("--- Printing ---\n"); - //for (i = 0; i < tRoot->keyCount - 1; i++) printf("%d ", tRoot->value[i]); if (tRoot != NULL) inOrder(tRoot); else printf("\nThe tree is empty!\n"); @@ -219,15 +218,23 @@ struct node* insertN(int value,struct node *root,struct node *parent){ parent->keys[0] = leftHalf; parent->keys[1] = rightHalf; - free(tempRoot); // Delete old root node box + //free(tempRoot); // Delete old root node box return parent; } else { for (i = 0; i < parent->keyCount; i++){ if (parent->keys[i] == tempRoot){ parent->keys[i] = leftHalf; parent->keys[i+1] = rightHalf; + } else if (parent->keys[i] != NULL) { + for (j = 0; j < parent->keys[i]->keyCount; j++){ + if (parent->keys[i]->keys[j] == tempRoot){ + parent->keys[i]->keys[j] = leftHalf; + parent->keys[i]->keys[j+1] = rightHalf; + } + } } } + free(tempRoot); return leftHalf; } diff --git a/btree.exe b/btree.exe index 9d9d876740b4b4cd4def34ff0748ec584f2ea0ab..152728c0decb370c98a4fb5f2decb9d41813b151 100644 GIT binary patch delta 4009 zcmZ{n4OElY8ONXd5=evq34TSzFTSkS33?c_qpm>`jQE8gC<;o@id7LQg6*^#6t#p1 zBwSnFtSj0bJ>5R#hA#Ogv+s8K?5R!T+gBj4ncDSNs#_2MiVVJoL}g@n?e* zLVHk9c^8{uyeK$P8m;38f}dd>yfZjHx-k;Kvmd`4!*xkUup2yELs5Ox>nV)nhLD(% zlh9|6j`NJeAa+xn$}vz|U_0C%*g zd0S{Y75z!U=YCLc2%#Z%ZVHCUX6$l9}figun<)33>; z&15Wth1ZXcl`&?Myt6Szp<0f-^tt^S=;KjWOqAuIGuRjQ_Yvk<9SBJC|lPq z;mg)J%-xkIwhJGWZEQ7rvG$uCJ7jYpoOkOYMef+6*v($QLIh3r`*th7Y_G%Yw(oF> zxc}?9YTq%!wFg}_X0H$KxN6MZKIj^QlXsXei4FOTmq)zB4)d=gEaR8rV&maKT|4ej z(p21)Of)&nn#$vGxH?cCf%ar!pTr9y7qTn-c%+5*MAoJ^#~7jVp|5Q0&Sv}Rvi|l5 zH7CYk2k;FzAY3!bA7Ib6XzaP>zR#DNyY#dpyagQ-n|GeM6KZq}*xAC*=@K%9Sh+2R zC*e+rknwWJNM}u1!ViS&>Ha_Ano{*gS$Go0`y);tTGKV|rf;Jr1PvSP_4%Ai!Da9@ zqCynGO)e>k)f+~!wx-dBFLVX#V1(=gFhMb-5SPGI;um2yaVZoMmq96UIcz1~2$jSy z@kL`(ZJWR~&y!C* z$Rv9uED}5!KPK1)FOXvwtS5d|o<p%}kBAAcy$Zu$K4` z>?A%6yNQp$KH|6GAn|YDPsB&z1aTwWCVm(Gt*{L+0;?uC5xCLs7KZe(cTj32!tUneLdCs58*D_cgx%i9^`#8 ze*`y?56RpDZscP!e+*ZVPlw{IQvvPpB{te+$3?h=d|l?x`J4$uY=NZQIN(5kf^mNK zqAm`4VCXO-DECHBpF5$)pQ1Qly?rh|AK)(}xtIW0EHPu^J`=?RKCsFJdTglJDr_jL z@d)aZ3|yBu$QHsXY1j}Z?p{$$5aNHD1Z&un`!;Z-xeGPI?_{#&+!RX1wl|_!G)jzFda6C>DSqrsn$W zA$+pQ$=Xmma%>lRb@*D*IgXx@U~BQs+0&q#X4;{HzD z{_l_F=0`K?5lz zmeQ`r+A=SN>ts3`89naq0;lN8)E-y#_me2AE(;Kl_`$r|O)SIu9{#`FVC z4KH3;B$^_UZjnVQQLq-VLP2egMRF=wjo6@|X0cOh3`9}$pe3#+O-+5SlQnWzZmh6b zpNrv*nQ598W$Q~f0JQMYd9hN7o@eA`^gkb^Y#1KO!qSyu$J+Rtd9ec;@Ig~HSZv}% zd}&~c9eKy_h}xIN;wgG(=@v;B#m6s;kt*~}S<6N+k$Fje44y`wADhrjfkgl{-a1w} zB#850SXflP;RP^8@vHec{j+4L{9xo46cw#sQP9SxS*Ky3I_p{~OV4|)$?;A~2+yhz zftxI1gimpV^E|s?t=NiF1;=pu<;&|Pd%q{ztOjsWV)-SdtBcDDVHAxo0#%^~7yj85 NITA!Qy}qJb{a^Fu-Wvb_ delta 3819 zcmZ{m3s6+o8G!$@EbIac?1~D$5fG~qSshBXXmf$PxIEPLL41Jj;`;$;5Y)y8Dq2}K zz^;F^#>51YHffu2G}2~Fn?~XzKB%c00;yptMl-I}iF8DZuWbKwFMGt9C z{O3RCo_nj?Saln7S81BFJ=N1RhaP#ZyvJnR&d#vh#w^WUra5KAUuqXI2OiWWjW8Pl zc0GvLx!&jVd1r+J+$thEqm3toap#=5@mj9||Eo`-3dJAvQ5ADk{cpL?YU0YtMk+3pMKti9Z%p5M0M*;<%7eY@gCe-XT&4#cf!I-TeV9o>H^NiK`Qwe4p#EH#jyhKO1TCmUvJp6VMthHS<%usv-2 z@)n-|C>{4UIxYXWz5I-&i%tp`dj?y&woc?yUYBd9+f8Ra)zVTP~yEFI3B9{tH%uy*2FnM%4U-F5>?EcPF0dg<+A82kHu5AP##YD zWUf!d+Yv9ZuQ1(cMYpjk!yGF?Ww)GQeOMtkCmp&5DO+?W=9oS`pjIFlNOM}K83 zEP5Qevqii&;XL)ccH=}gx|qj!M}&qg5QN*g5QT%1^)r|3;q){ z2>t;6D)%H zA`}R|44eF10bfFuUw{^<72FDk1%C~f1pf=#1Yd#cg1>>gg4^M-;D3Wo>reD5^bvdw z1`;dlm*HDT5{B!LCin)-5PS^^1>b}fg1xX#@Lkv>xD&P$t52K@y6EZqwes}2fNn7# zPpJt2$BYflYl1tZc~!A~243R*3ZH-*#P2A48ajxND*QRL6Q5N0GJH*ZN#QS{h4`An zE$A9Mpu(R`2hHZ{$t=EyJIOB|?ty!t1nM(?uh;W@kG#|-!~I^DRyWXRi_&Cx2yucR zDR&VUW#|TnsyCAG6qb{qmZ1yZ7&!oQlloWq;Gvk-*K1m(F3MmT7<+bC1~8Kvk|JuE z@_r&&h5#lBeGr=>SjT1w4raxILs%8(`Sg<^l+|;AnhXYZLPg?Wc1o~`H4E;;Is}{8 zeZl?M6Jm9VfT`xJfd37W=!NtVYh>e1;e8)cr5VJ42J9CEcyUTBzLi$w$Fb=GKTR)UfLAjHVL^_bXnIB+Gm{)Q#7tMU8h>or z(v4-5i>d)Cj}A?F18{=uW)k@h8+D7U+l0T}ZZ9reSppqGq)d86@LMbhmaHjRN&pLlM#SvV1h5wncqXX>ybIWVtmLxyvH#%+}%KEYCBsj3fErfgGzJqjRmA4pqC)kDL9P zJyWfkPSt3fW~CAq=KdUOiHr&vrdwHzLe)fOh4eNn6>f%Y3!b;8pmqj*GGzs0an1|4 zgV>RqvS+3huS`wBt<=w*mV!^HZ>9c~Syr4qJq5d|zfAr5*>1Gig7NjN#aNo>W*5a85isBLOw{kmcT?t` z{5Y<2ycml|veWd7%hr^x14zc<1#!FrnFX1VllrK;L?>}s=~BK;624s!*Vjl-m%6Kb z=f=@3f6;`k1xKke&INH)fkO+nXttR!abYY~u+g?~DARP9aIHO->V)>V1hWXt1Ly)N zK+k6Lsg@O$uUi2}OxSLp8`&i0vfB%biqVG`yQuGZ9>@I>KJT7LPWx(SZwoHpsmQzT|zTe`BOY#F$p^Qj`AP7_XAJXf>U K)VObPm+t?V`j>_P From ec4709cc59a8117948ea727ac7a391ac181d8a9f Mon Sep 17 00:00:00 2001 From: "Raven G. Duran" Date: Sun, 30 Sep 2012 23:09:48 +0800 Subject: [PATCH 08/13] Added SearchNValue and SearchNBox --- btree.c | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ btree.exe | Bin 27530 -> 28104 bytes 2 files changed, 54 insertions(+) diff --git a/btree.c b/btree.c index 5901b14..7d55de1 100644 --- a/btree.c +++ b/btree.c @@ -10,6 +10,11 @@ struct node { int keyCount; } *tRoot = NULL; +struct nodePosition { + int key; + struct node* box; +}; + // Globals int treeOrder; @@ -23,6 +28,8 @@ void doInOrder(); // Tree Operations struct node* newNode(int value,struct node *parent); struct node* insertN(int value,struct node *root,struct node *parent); +struct node* searchNValue(int value,struct node *root); +struct nodePosition* searchNBox(struct node *toFind,struct node *root); // Printing void inOrder(struct node *root); @@ -94,6 +101,11 @@ void doSearch(){ system("cls"); printf("--- Search ---\n"); + printf("To Find: "); + scanf("%d",&toFind); + + if (searchNValue(toFind,tRoot) == NULL) printf("Not found!\n"); + else printf("found!\n"); printf("\n\n\nPress any key to continue...\n"); getch(); @@ -221,6 +233,14 @@ struct node* insertN(int value,struct node *root,struct node *parent){ //free(tempRoot); // Delete old root node box return parent; } else { + // Find the parent of the current left and right box + struct nodePosition *nodeF = searchNBox(tempRoot,parent); + if (nodeF != NULL){ + nodeF->box->keys[nodeF->key] = leftHalf; + nodeF->box->keys[nodeF->key+1] = rightHalf; + } + + /* for (i = 0; i < parent->keyCount; i++){ if (parent->keys[i] == tempRoot){ parent->keys[i] = leftHalf; @@ -234,6 +254,8 @@ struct node* insertN(int value,struct node *root,struct node *parent){ } } } + */ + free(tempRoot); return leftHalf; @@ -246,6 +268,38 @@ struct node* insertN(int value,struct node *root,struct node *parent){ return root; } +struct node* searchNValue(int value,struct node *root){ + int i; + struct node *nodeF = NULL; + if (root == NULL) return NULL; + else { + for (i = 0; i < root->keyCount; i++){ // -1 since left and right key of every data box + if (root->value[i] == value) return root; + else if (nodeF != NULL) return nodeF; + else nodeF = searchNValue(value,root->keys[i]); + } + return nodeF; + } +} + +struct nodePosition* searchNBox(struct node *toFind,struct node *root){ + int i; + struct nodePosition *nodeF = NULL; + if (root == NULL) return NULL; + else { + for (i = 0; i < root->keyCount; i++){ // -1 since left and right key of every data box + if (root == toFind) { + nodeF->box = root; + nodeF->key = i; + return nodeF; + } + else if (nodeF != NULL) return nodeF; + else nodeF = searchNBox(toFind,root->keys[i]); + } + return nodeF; + } +} + // Printing void inOrder(struct node *root){ int i; diff --git a/btree.exe b/btree.exe index 152728c0decb370c98a4fb5f2decb9d41813b151..0309cb37c76b2d87a0f53b2702d3ed544e6a4371 100644 GIT binary patch delta 8214 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 EKjuqFyZ`_I delta 7348 zcmZ{o4P2B}zQ_O12m>N71L}&3N-+4AFX$y|Q*(eBnG6yG(gFokKoN)#Th~|zMT%*} z3!eJquI>ib+Gk%fl1h8IMQMu`wXk`!(!1f7+jw=0+p4$BocsGf&&+wA`E2)mKI8K} zzwkDXT9TSx9%xjv8XAR5=vVH?>_L?J}!FL!);&~z$J>`?Aj62+kM zv-H+z4AtRh!7m9vLog^^G>>RtRde07V%BUoP=taUP#eLUsGV>E{4H9 z7O^mNYQ!}dG+#n@l&B7!tK1~^hu&`bC`No7YE9^lA@c6SKb}dJR2#YDz1t#S{l&1i zB1XiUlcvnam^;Dhoe3vyyEVi!HnPk{o=l57#Of`K5%-xJO-DwF)8?5A-;08;3QR|u zWV4Ys0&~If%r~$!eVAXDXJc&|Yo9{%@)CG0Vo_MU>shu5v8M9aYZ@0bKd*5s^V1r? z$o!|!mwK4p(s%rKEd@UcI0V`R(JuMcEHs8 zIx6=by5aNr1B3?xZ~H3^$5?}@*}e*X_k-jta*l6DN!!W$m405KQir0 z3?T56JnegM^CC`^8e+Qm%A5RIsDDL%$2O-m`!|^1`%(LNv(f(9NSe+8)C%@tg7;52 z!rr4l$hvu9XN`ciNc_*p-6Q%hoE1AFtYIH=gttfaJQs1lV!p_oG7%N|Z{{nE)5Vg= z*%MXu%19huN2I4|I(#e$T?XM{#DttQTUu}DR8e99u{F;aE+I$tE1`-ge>Wa@-RJ7`tC+au`=JmFmycl8gjA=QZ zBog9M?qX~0DL5$=$ANvOs6J!b+Zv|+h`(!>|6hN*;u@!~%e2v}|4n!R=2#=$1y;UO zJD?ry#y@<&d-s@#j-C~%qnAvuL2KK*x6iRZ1Fg@|$rrcdXqR2Ij~?rEVz|%oM{TTI z8|&@LQPmfIL@s&`&kifirtHx+b;u45G&{{9oOHF>X)eV{PNm6`=NXclZ%8i9klZbF zx3o{E`z5<>r3%@(jp`-;l(tD;K#xgYNH0oWM6XG{gWi_Bm`+Nz(SYPkI_qby{;&AG z;Zm!&Q_2{dI%LNt1e%?)4b?jh)!%8TeyO4Q99ra`Y)8GTB`>2Y$$9jE7z0)kNGip-#v`;3L@1MeFq`;6=p&_XihNM;+lDZEYr!_kkKF!a(0(_1x zsj-S_P{t}Q@SAY35<{?3L$Ec5U~3J*))|78tHFLyi(AFTxi}!VK=6nN=1K}1Yg2VQ zA4z|+W6kulx6u&0#t^&KaNg<+=j}nmd8-c`u{0FaU^ru&4QK2jYLw>ZiC?l3V?J=RkJY2bvu>BA3n0PP+)-wraCeo1wgR!x`wH#nNVvi*jX0(0!60 zH{2>uP_@*bq=S<8(npeiNoOSQqan$^rt^}YA`8D1(CpYPo67hIw9^4{$bqM6rQ~O5 zqvQkBBKaWglKd>~mHa#ElKgvmRr2%ny5w&9Qt}J*PnYbxNZ(3+i9$?)Opj2M*=46b+AjxA&>tk9r1vHF(U+3nrLQFSQ#gO^ zpxNnt8ZY?+S|GWf3MK!UiX{)y!z1vr(I)?eTIIlpv|I9j(({r})1c&!>9pie=yS=R z($|vD(D#!6N?{>tC?q;Wagtr<=w{jZ8!eLjIps?Jg4RerPxX@jP92iJq~|1i@ns(f zcAm~j9wM*gujm_QuHQ~y(+_gsDuspyCjT#u0&6$zV}!3U-_O;X`7y#bhmWm#HB;KI z>Tl8|=(|+zB`D?^gwl`E1Hl9Zchtgs+IjZg+d zj5d!z*%zd=LrIAal71y#$ea?|g-?V!vE4CNd|;+-YQW`5@k1g6crfSv{at>9m* zl9HOT4YgD!m4GA6NYAc{>4fI6%3vaePo?lNkYyv;E_=hcp zG884|*e1L96*cVls}0@{B@aeeKEHVllvMP1BQ={XP)gC$ZTL0D_mXbIe~hWtnLPC)3)>Rz+I0`q@@b)eNJZ9b5v_MtnJ5<9lO%?UY*=IS zA9+?R?*jh*Xu(^RLauj+W)GO4}{Y>M5J*Jx_j%ns){O`RI1E_a%`H9Q3D)o|85PSb#fzXuL! zI6dEK8rJY&z7qv(Uv`VI7C04)N(Ty@qBS>NBo;bF)3S8&8(eSTnsBdEH0Gs?U)}38 z9>c zAewT+O~BF&-j)opXmwcVar_adh*jC+MCs~qR~?>$+EL)GJ&Bo#I7@t-_{b1>p^U)~ zH@ja6e7NwqW)p@>KYLY`l8X9rJ|_b~o__)xKJmJr6eyjpAftJZN~I(Cpgbr|xblex zq6NNpv|y}k#efAF>#q6R=VOfMN*9#)pzw#-9bO*z(>>t2k0nYpDCeMXXx-)q)h19Y z+s7buXHe1;dHK-v6lX&j@ZUC?gIhHlm%%6-54dO>4_)D^RMMVxoT)5AiG{l&@FzCrC{}+i}Y8TCd~pP%Z_f_|Jc_86l38Cc9#J z+0boIuBnHh=zs``l?s*Gr#sv9k<8MBF4LFfMh>c~* zuK$2u7qnUZP;40IZPB*o6DYkw3&9_9?HI?!Z}T171o`3DVW~QcZAvOCsyA<1Pqv^{ zA6EjSfgnf8P!fZbxlnEks(2w3ZV*-1b@dx+8!Gao>ynbP>gos9mJL`$^_s~_j_|BW z9=#fqf-|fUZ>>qbb0>6Lko!IC9;NFG`dcWe(x#-cykYHn+>1eL(j#WCo#twn8s3GR z1Pw`rQ$7Jt`lErBkDyGKzF9fX@o^aS_%~D~P_R0R&ksIny3J%LR`KE5SXZiC2)3LB zy%Se`ubfc6g~Cp?9p?Yg<)$qtQx%j`xau}8D6@j{^gtO3vgwAR;1Oa->jWfjdZM5B z75#vH0i`==nZAOO78L9{6h0|>LeXKWV}p_mC7k2yM)UkedidObQOco&$Y3SqTQ=~= z&u~ye55uNip6?Rv#8G03WKTQ0fp+-=MQlxM_Y$ zHvN24LwOC640Z|QB_)-$o003<^16l%57d^dFRNWwU0!cXBQaF&jHoVusJvSJbnVHh HXbk&52@{*- From 9919d4eb1edfdb72600b4724119048657b84825c Mon Sep 17 00:00:00 2001 From: "Raven G. Duran" Date: Mon, 1 Oct 2012 09:06:34 +0800 Subject: [PATCH 09/13] Partial Stack Implementation fro multiple splits --- btree.c | 96 +++++++++++++++++++++++++++++++++++++++--------------- btree.exe | Bin 28104 -> 29694 bytes 2 files changed, 69 insertions(+), 27 deletions(-) diff --git a/btree.c b/btree.c index 7d55de1..4c2403d 100644 --- a/btree.c +++ b/btree.c @@ -15,6 +15,16 @@ struct nodePosition { struct node* box; }; +// Left-right stack for multiple splitting +struct splitStack { + struct node *leftHalf; + struct node *rightHalf; + struct splitStack *next; +} *head = NULL; + +void pushS(struct node *leftHalf, struct node *rightHalf); +struct splitStack *popS(); + // Globals int treeOrder; @@ -28,7 +38,7 @@ void doInOrder(); // Tree Operations struct node* newNode(int value,struct node *parent); struct node* insertN(int value,struct node *root,struct node *parent); -struct node* searchNValue(int value,struct node *root); +struct nodePosition* searchNValue(int value,struct node *root); struct nodePosition* searchNBox(struct node *toFind,struct node *root); // Printing @@ -209,14 +219,20 @@ struct node* insertN(int value,struct node *root,struct node *parent){ struct node *rightHalf = NULL; for (i = 0; i <= left; i++){ // Move all left half data to new LeftHalf Box - leftHalf = insertN(root->value[i],leftHalf,parent); // Set the parent to NULL temporarily + leftHalf = insertN(root->value[i],leftHalf,NULL); // Set the parent to NULL temporarily leftHalf->keys[i] = root->keys[i]; + + if (root->keys[i] != NULL) root->keys[i]->parent = leftHalf; } leftHalf->keys[left+1] = root->keys[left+1]; + if (root->keys[treeOrder] != NULL) root->keys[treeOrder]->parent = leftHalf; for (i = right; i < treeOrder; i++){ // Move all right half data to new LeftHalf Box - rightHalf = insertN(root->value[i],rightHalf,parent); + rightHalf = insertN(root->value[i],rightHalf,NULL); rightHalf->keys[i] = root->keys[i]; + + if (root->keys[i] != NULL) root->keys[i]->parent = rightHalf; } rightHalf->keys[treeOrder] = root->keys[treeOrder]; + if (root->keys[treeOrder] != NULL) root->keys[treeOrder]->parent = rightHalf; int pIsNull = parent == NULL ? 1 : 0; struct node *tempRoot = root; @@ -234,30 +250,27 @@ struct node* insertN(int value,struct node *root,struct node *parent){ return parent; } else { // Find the parent of the current left and right box - struct nodePosition *nodeF = searchNBox(tempRoot,parent); - if (nodeF != NULL){ - nodeF->box->keys[nodeF->key] = leftHalf; - nodeF->box->keys[nodeF->key+1] = rightHalf; - } - - /* + int found = 0; for (i = 0; i < parent->keyCount; i++){ - if (parent->keys[i] == tempRoot){ + if (parent->keys[i] != NULL && parent->keys[i] == tempRoot){ parent->keys[i] = leftHalf; parent->keys[i+1] = rightHalf; - } else if (parent->keys[i] != NULL) { - for (j = 0; j < parent->keys[i]->keyCount; j++){ - if (parent->keys[i]->keys[j] == tempRoot){ - parent->keys[i]->keys[j] = leftHalf; - parent->keys[i]->keys[j+1] = rightHalf; - } - } + + leftHalf->parent = parent; + rightHalf->parent = parent; + found = 1; } } - */ + + struct nodePosition *nodeF = searchNBox(tempRoot,tRoot); + if (nodeF != NULL && !found) { + printf("Beep: i is %d\n",nodeF->key); + nodeF->box->keys[nodeF->key] = leftHalf; + nodeF->box->keys[nodeF->key+1] = rightHalf; + } - free(tempRoot); + //free(tempRoot); return leftHalf; } @@ -268,13 +281,18 @@ struct node* insertN(int value,struct node *root,struct node *parent){ return root; } -struct node* searchNValue(int value,struct node *root){ +struct nodePosition* searchNValue(int value,struct node *root){ int i; - struct node *nodeF = NULL; + struct nodePosition *nodeF = NULL; if (root == NULL) return NULL; else { for (i = 0; i < root->keyCount; i++){ // -1 since left and right key of every data box - if (root->value[i] == value) return root; + if (root->value[i] == value) { + nodeF = (struct nodePosition*)malloc(sizeof(struct nodePosition)); + nodeF->box = root; + nodeF->key = i; + return nodeF; + } else if (nodeF != NULL) return nodeF; else nodeF = searchNValue(value,root->keys[i]); } @@ -289,6 +307,7 @@ struct nodePosition* searchNBox(struct node *toFind,struct node *root){ else { for (i = 0; i < root->keyCount; i++){ // -1 since left and right key of every data box if (root == toFind) { + nodeF = (struct nodePosition*)malloc(sizeof(struct nodePosition)); nodeF->box = root; nodeF->key = i; return nodeF; @@ -305,8 +324,8 @@ void inOrder(struct node *root){ int i; if (root == NULL) return; else { - // root = root->keys[2]; - for (i = 0; i < root->keyCount; i++){ // -1 since left and right key of every data box + //root = root->keys[1]->keys[3]; + for (i = 0; i < root->keyCount + 2; i++){ // -1 since left and right key of every data box inOrder(root->keys[i]); if (i < root->keyCount - 1) printf("~%d~\n",root->value[i]); } @@ -318,12 +337,12 @@ void levelOrder(struct node *root){ if (root == NULL) return; else { for (i = 0; i < root->keyCount - 1; i++){ // -1 since left and right key of every data box - printf("%d ",root->value[i]); + printf("Node %d : %d ",i,root->value[i]); } printf(" "); if (root->parent == NULL) printf("\n"); else { - for (i = 0; i < root->parent->keyCount; i++){ // Check if had a right sibling, if none then proceed to next level + for (i = 0; i < root->parent->keyCount + 2; i++){ // Check if had a right sibling, if none then proceed to next level if (root->parent->keys[i] == root){ if (root->parent->keys[i+1] == NULL) printf("\n"); break; @@ -336,3 +355,26 @@ void levelOrder(struct node *root){ } } } + +void pushS(struct node *leftHalf, struct node *rightHalf){ + struct splitStack *newNode = (struct splitStack*)malloc(sizeof(struct splitStack)); + newNode->leftHalf = leftHalf; + newNode->rightHalf = rightHalf; + if (head == NULL){ + head = newNode; + head->next = NULL; + } else { + newNode->next = head; + head = newNode; + } +} + +struct splitStack *popS(){ + if (head == NULL) { + printf("Stack Underflow!!\n"); + getch(); + exit(-1); + } else { + + } +} diff --git a/btree.exe b/btree.exe index 0309cb37c76b2d87a0f53b2702d3ed544e6a4371..cfd147d28c2c7c01bd6ec86ffd73d21b98832d32 100644 GIT binary patch delta 8073 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 delta 6809 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 bsn4N~Ds`Cg0Vbi(@5;c;8@RJ8(Eon{{yhjL From de32321cdfe0985cd9a3c24536cd6a77ab93d784 Mon Sep 17 00:00:00 2001 From: "Raven G. Duran" Date: Tue, 2 Oct 2012 00:29:59 +0800 Subject: [PATCH 10/13] Starting newAlgo --- btree.c | 79 ++++++++++++++++++++++++++++++++++++++++-------------- btree.exe | Bin 29694 -> 30754 bytes 2 files changed, 59 insertions(+), 20 deletions(-) diff --git a/btree.c b/btree.c index 4c2403d..b982f46 100644 --- a/btree.c +++ b/btree.c @@ -45,6 +45,10 @@ struct nodePosition* searchNBox(struct node *toFind,struct node *root); void inOrder(struct node *root); void levelOrder(struct node *root); +// Utils +int findMax(struct node *root); +int findMin(struct node *root); + int main(){ // Initialize printf("--- Initialization ---\n"); @@ -90,7 +94,9 @@ void doInsert(){ printf("Value: "); scanf("%d",&value); - tRoot = insertN(value,tRoot,NULL); + + if (tRoot == NULL) tRoot = insertN(value,tRoot,NULL); + else insertN(value,tRoot,NULL); printf("\n\n\nPress any key to continue...\n"); getch(); @@ -224,7 +230,7 @@ struct node* insertN(int value,struct node *root,struct node *parent){ if (root->keys[i] != NULL) root->keys[i]->parent = leftHalf; } leftHalf->keys[left+1] = root->keys[left+1]; - if (root->keys[treeOrder] != NULL) root->keys[treeOrder]->parent = leftHalf; + if (root->keys[treeOrder] != NULL) root->keys[treeOrder]->parent = leftHalf; for (i = right; i < treeOrder; i++){ // Move all right half data to new LeftHalf Box rightHalf = insertN(root->value[i],rightHalf,NULL); @@ -232,12 +238,13 @@ struct node* insertN(int value,struct node *root,struct node *parent){ if (root->keys[i] != NULL) root->keys[i]->parent = rightHalf; } rightHalf->keys[treeOrder] = root->keys[treeOrder]; - if (root->keys[treeOrder] != NULL) root->keys[treeOrder]->parent = rightHalf; + if (root->keys[treeOrder] != NULL) root->keys[treeOrder]->parent = rightHalf; int pIsNull = parent == NULL ? 1 : 0; struct node *tempRoot = root; struct node *pParent = pIsNull ? NULL : parent->parent; + pushS(leftHalf,rightHalf); parent = insertN(root->value[mid],parent,pParent); if (pIsNull){ // Special case if splitted is the tRoot (The very Root) @@ -246,11 +253,34 @@ struct node* insertN(int value,struct node *root,struct node *parent){ parent->keys[0] = leftHalf; parent->keys[1] = rightHalf; + tRoot = parent; //free(tempRoot); // Delete old root node box return parent; } else { - // Find the parent of the current left and right box - int found = 0; + + struct splitStack *ss = popS(); + + + // put left half properly + if (ss != NULL){ + // Find the parent of the current left and right box + int max = findMax(leftHalf); + for (i = 0; i < parent->keyCount; i++){ + if (max < parent->value[i]){ + parent->keys[i] = leftHalf; + parent->keys[i+1] = rightHalf; + + printf("Left half is: %d\n",leftHalf->value[0]); + + leftHalf->parent = parent; + rightHalf->parent = parent; + } + } + + // put right half properly + } + + /** for (i = 0; i < parent->keyCount; i++){ if (parent->keys[i] != NULL && parent->keys[i] == tempRoot){ parent->keys[i] = leftHalf; @@ -258,23 +288,13 @@ struct node* insertN(int value,struct node *root,struct node *parent){ leftHalf->parent = parent; rightHalf->parent = parent; - found = 1; } } + **/ - - struct nodePosition *nodeF = searchNBox(tempRoot,tRoot); - if (nodeF != NULL && !found) { - printf("Beep: i is %d\n",nodeF->key); - nodeF->box->keys[nodeF->key] = leftHalf; - nodeF->box->keys[nodeF->key+1] = rightHalf; - } - - //free(tempRoot); return leftHalf; } - // To do : Non special case split and distribute... or if parent has a parent with values } } @@ -337,7 +357,7 @@ void levelOrder(struct node *root){ if (root == NULL) return; else { for (i = 0; i < root->keyCount - 1; i++){ // -1 since left and right key of every data box - printf("Node %d : %d ",i,root->value[i]); + printf("%d ",i,root->value[i]); } printf(" "); if (root->parent == NULL) printf("\n"); @@ -372,9 +392,28 @@ void pushS(struct node *leftHalf, struct node *rightHalf){ struct splitStack *popS(){ if (head == NULL) { printf("Stack Underflow!!\n"); - getch(); - exit(-1); + return NULL; } else { - + struct splitStack *temp = head; + head = head->next; + return temp; } } + +int findMax(struct node *root){ + int i, max = root->value[0]; + for (i = 0; i < root->keyCount; i++){ + if (root->value[i] > max) max = root->value[i]; + } + + return max; +} + +int findMin(struct node *root){ + int i, min = root->value[0]; + for (i = 0; i < root->keyCount; i++){ + if (root->value[i] < min) min = root->value[i]; + } + + return min; +} diff --git a/btree.exe b/btree.exe index cfd147d28c2c7c01bd6ec86ffd73d21b98832d32..f2dc5b90fbef9d548cf62e73bdb60cf6bb2df400 100644 GIT binary patch delta 7573 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 BXQ%)G delta 6824 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 From 83beea44c7a5c19649cae0bb4dde162c8b5b119b Mon Sep 17 00:00:00 2001 From: "Raven G. Duran" Date: Tue, 2 Oct 2012 01:47:44 +0800 Subject: [PATCH 11/13] Corrected wrong Right half distribution --- btree.c | 78 +++++++++++++++++++++--------------------------------- btree.exe | Bin 30754 -> 29700 bytes 2 files changed, 30 insertions(+), 48 deletions(-) diff --git a/btree.c b/btree.c index b982f46..2304883 100644 --- a/btree.c +++ b/btree.c @@ -39,7 +39,6 @@ void doInOrder(); struct node* newNode(int value,struct node *parent); struct node* insertN(int value,struct node *root,struct node *parent); struct nodePosition* searchNValue(int value,struct node *root); -struct nodePosition* searchNBox(struct node *toFind,struct node *root); // Printing void inOrder(struct node *root); @@ -68,7 +67,8 @@ void showMenu(){ printf(" _____ _____ \n"); printf(" | __ | ___ |_ _|___ ___ ___ \n"); printf(" | __ -| |___| | | | _| -_| -_| \n"); - printf(" |_____| |_| |_| |___|___| \n"); + printf(" |_____| |_| |_| |___|___| \n\n"); + printf(" A Project in Data Structures by Raven G. Duran BSIT - 2R1\n"); printf("\n\n"); printf("(1) Insert a Node\n"); @@ -227,18 +227,14 @@ struct node* insertN(int value,struct node *root,struct node *parent){ for (i = 0; i <= left; i++){ // Move all left half data to new LeftHalf Box leftHalf = insertN(root->value[i],leftHalf,NULL); // Set the parent to NULL temporarily leftHalf->keys[i] = root->keys[i]; - - if (root->keys[i] != NULL) root->keys[i]->parent = leftHalf; } leftHalf->keys[left+1] = root->keys[left+1]; - if (root->keys[treeOrder] != NULL) root->keys[treeOrder]->parent = leftHalf; - for (i = right; i < treeOrder; i++){ // Move all right half data to new LeftHalf Box + int j = 0; + for (i = right; i < treeOrder; i++, j++){ // Move all right half data to new LeftHalf Box rightHalf = insertN(root->value[i],rightHalf,NULL); - rightHalf->keys[i] = root->keys[i]; - - if (root->keys[i] != NULL) root->keys[i]->parent = rightHalf; - } rightHalf->keys[treeOrder] = root->keys[treeOrder]; - if (root->keys[treeOrder] != NULL) root->keys[treeOrder]->parent = rightHalf; + rightHalf->keys[j] = root->keys[i]; + } rightHalf->keys[j] = root->keys[treeOrder]; + int pIsNull = parent == NULL ? 1 : 0; struct node *tempRoot = root; @@ -247,37 +243,42 @@ struct node* insertN(int value,struct node *root,struct node *parent){ pushS(leftHalf,rightHalf); parent = insertN(root->value[mid],parent,pParent); + struct splitStack *ss = popS(); + if (pIsNull){ // Special case if splitted is the tRoot (The very Root) - leftHalf->parent = parent; - rightHalf->parent = parent; - parent->keys[0] = leftHalf; - parent->keys[1] = rightHalf; + ss->leftHalf->parent = parent; + ss->rightHalf->parent = parent; + parent->keys[0] = ss->leftHalf; + parent->keys[1] = ss->rightHalf; tRoot = parent; //free(tempRoot); // Delete old root node box - return parent; - } else { - struct splitStack *ss = popS(); + printf("\n\n"); + inOrder(parent); + printf("\n\n"); + + return parent; + } else { // put left half properly if (ss != NULL){ // Find the parent of the current left and right box - int max = findMax(leftHalf); + int max = findMax(ss->leftHalf); for (i = 0; i < parent->keyCount; i++){ if (max < parent->value[i]){ - parent->keys[i] = leftHalf; - parent->keys[i+1] = rightHalf; + parent->keys[i] = ss->leftHalf; + parent->keys[i+1] = ss->rightHalf; - printf("Left half is: %d\n",leftHalf->value[0]); + printf("Left half is: %d\n",ss->leftHalf->value[0]); + printf("Right half is: %d\n",ss->rightHalf->value[0]); - leftHalf->parent = parent; - rightHalf->parent = parent; + ss->leftHalf->parent = parent; + ss->rightHalf->parent = parent; + break; } } - - // put right half properly } /** @@ -292,7 +293,7 @@ struct node* insertN(int value,struct node *root,struct node *parent){ } **/ - return leftHalf; + return ss->leftHalf; } } @@ -320,31 +321,12 @@ struct nodePosition* searchNValue(int value,struct node *root){ } } -struct nodePosition* searchNBox(struct node *toFind,struct node *root){ - int i; - struct nodePosition *nodeF = NULL; - if (root == NULL) return NULL; - else { - for (i = 0; i < root->keyCount; i++){ // -1 since left and right key of every data box - if (root == toFind) { - nodeF = (struct nodePosition*)malloc(sizeof(struct nodePosition)); - nodeF->box = root; - nodeF->key = i; - return nodeF; - } - else if (nodeF != NULL) return nodeF; - else nodeF = searchNBox(toFind,root->keys[i]); - } - return nodeF; - } -} - // Printing void inOrder(struct node *root){ int i; if (root == NULL) return; else { - //root = root->keys[1]->keys[3]; + //root = root->keys[1]->keys[2]; for (i = 0; i < root->keyCount + 2; i++){ // -1 since left and right key of every data box inOrder(root->keys[i]); if (i < root->keyCount - 1) printf("~%d~\n",root->value[i]); @@ -357,7 +339,7 @@ void levelOrder(struct node *root){ if (root == NULL) return; else { for (i = 0; i < root->keyCount - 1; i++){ // -1 since left and right key of every data box - printf("%d ",i,root->value[i]); + printf("%d ",root->value[i]); } printf(" "); if (root->parent == NULL) printf("\n"); diff --git a/btree.exe b/btree.exe index f2dc5b90fbef9d548cf62e73bdb60cf6bb2df400..fcbebcfba33a53208aaaa7e5fd6120443b497a18 100644 GIT binary patch delta 7744 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 KX|by_U| delta 8031 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 From 14cf0cf951f4f6b3bb1efdaeec05ea4b1a7907c5 Mon Sep 17 00:00:00 2001 From: "Raven G. Duran" Date: Tue, 2 Oct 2012 02:28:47 +0800 Subject: [PATCH 12/13] Almost done, fixing multilevel bugs --- btree.c | 38 +++++++++++++++++--------------------- btree.exe | Bin 29700 -> 29700 bytes 2 files changed, 17 insertions(+), 21 deletions(-) diff --git a/btree.c b/btree.c index 2304883..5ffd8f9 100644 --- a/btree.c +++ b/btree.c @@ -262,36 +262,32 @@ struct node* insertN(int value,struct node *root,struct node *parent){ } else { - // put left half properly - if (ss != NULL){ + // put left and right half properly + int max = findMax(ss->leftHalf); // Max of left half + struct nodePosition *position = searchNValue(max,tRoot); + + if (position != NULL){ + printf("Left half Max %d is Found at key: %d\n",max,position->key); + } + + if (ss != NULL && position != NULL){ // Find the parent of the current left and right box int max = findMax(ss->leftHalf); - for (i = 0; i < parent->keyCount; i++){ - if (max < parent->value[i]){ - parent->keys[i] = ss->leftHalf; - parent->keys[i+1] = ss->rightHalf; + for (i = 0; i < position->box->parent->keyCount; i++){ + if (position->box->parent->keys[i] == position->box){ + position->box->parent->keys[i] = ss->leftHalf; + position->box->parent->keys[i+1] = ss->rightHalf; printf("Left half is: %d\n",ss->leftHalf->value[0]); printf("Right half is: %d\n",ss->rightHalf->value[0]); - ss->leftHalf->parent = parent; - ss->rightHalf->parent = parent; + ss->leftHalf->parent = position->box->parent; + ss->rightHalf->parent = position->box->parent; break; } } - } - - /** - for (i = 0; i < parent->keyCount; i++){ - if (parent->keys[i] != NULL && parent->keys[i] == tempRoot){ - parent->keys[i] = leftHalf; - parent->keys[i+1] = rightHalf; - - leftHalf->parent = parent; - rightHalf->parent = parent; - } - } - **/ + + } return ss->leftHalf; } diff --git a/btree.exe b/btree.exe index fcbebcfba33a53208aaaa7e5fd6120443b497a18..d52c34b2099d4d9061fb308a22d26d0a693dce78 100644 GIT binary patch delta 4730 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 delta 4431 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 From bad6f75f9fd2b44d831ecbd70ecd5a8e57841e33 Mon Sep 17 00:00:00 2001 From: "Raven G. Duran" Date: Wed, 3 Oct 2012 07:11:53 +0800 Subject: [PATCH 13/13] For project submission --- btree - Copy.c | 407 +++++++++++++++++++++++++++++++++++++++++++++++++ btree.c | 113 +++++--------- btree.exe | Bin 29700 -> 29110 bytes 3 files changed, 444 insertions(+), 76 deletions(-) create mode 100644 btree - Copy.c diff --git a/btree - Copy.c b/btree - Copy.c new file mode 100644 index 0000000..ea80dcd --- /dev/null +++ b/btree - Copy.c @@ -0,0 +1,407 @@ +#include +#include +#define MAX 100 + +// B-Tree Node Structure +struct node { + int value[MAX]; + struct node *keys[MAX+1]; + struct node *parent; + int keyCount; +} *tRoot = NULL; + +struct nodePosition { + int key; + struct node* box; +}; + +// Left-right stack for multiple splitting +struct splitStack { + struct node *leftHalf; + struct node *rightHalf; + struct splitStack *next; +} *head = NULL; + +void pushS(struct node *leftHalf, struct node *rightHalf); +struct splitStack *popS(); + +// Globals +int treeOrder; + +// Menu functions +void showMenu(); +void doInsert(); +void doDelete(); +void doSearch(); +void doInOrder(); + +// Tree Operations +struct node* newNode(int value,struct node *parent); +struct node* insertN(int value,struct node *root,struct node *parent); +struct nodePosition* searchNValue(int value,struct node *root); + +// Printing +void inOrder(struct node *root); +void levelOrder(struct node *root); + +// Utils +int findMax(struct node *root); +int findMin(struct node *root); + +int main(){ + // Initialize + printf("--- Initialization ---\n"); + printf("B-Tree Order: "); + scanf("%d",&treeOrder); + + // Run menu + showMenu(); + + getch(); + return 0; +} + +// Menus +void showMenu(){ + system("cls"); + printf(" _____ _____ \n"); + printf(" | __ | ___ |_ _|___ ___ ___ \n"); + printf(" | __ -| |___| | | | _| -_| -_| \n"); + printf(" |_____| |_| |_| |___|___| \n\n"); + printf(" A Project in Data Structures by Raven G. Duran BSIT - 2R1\n"); + + printf("\n\n"); + printf("(1) Insert a Node\n"); + printf("(2) Delete a Node\n"); + printf("(3) Search a Node\n"); + printf("(4) Print In Order\n"); + printf("(5) Exit\n"); + + switch(getch()){ + case '1' : doInsert(); break; + case '2' : doDelete(); break; + case '3' : doSearch(); break; + case '4' : doInOrder(); break; + default : exit(0); + } +} + +void doInsert(){ + int value; + + system("cls"); + printf("--- Insertion ---\n"); + printf("Value: "); + scanf("%d",&value); + + + if (tRoot == NULL) tRoot = insertN(value,tRoot,NULL); + else insertN(value,tRoot,NULL); + + printf("\n\n\nPress any key to continue...\n"); + getch(); + showMenu(); +} + +void doDelete(){ + system("cls"); + printf("--- Deletion ---\n"); + + printf("\n\n\nPress any key to continue...\n"); + getch(); + showMenu(); +} + +void doSearch(){ + int toFind; + + system("cls"); + printf("--- Search ---\n"); + printf("To Find: "); + scanf("%d",&toFind); + + if (searchNValue(toFind,tRoot) == NULL) printf("Not found!\n"); + else printf("found!\n"); + + printf("\n\n\nPress any key to continue...\n"); + getch(); + showMenu(); +} + +void doInOrder(){ + int i; + + system("cls"); + printf("--- Printing ---\n"); + + if (tRoot != NULL) inOrder(tRoot); + else printf("\nThe tree is empty!\n"); + + printf("--- Level Order ---\n"); + if (tRoot != NULL) levelOrder(tRoot); + else printf("\nThe tree is empty!\n"); + + printf("\n\n\nPress any key to continue...\n"); + getch(); + showMenu(); +} + +// Operations +struct node* newNode(int value,struct node *parent){ + struct node *root = (struct node*)malloc(sizeof(struct node)); + root->value[0] = value; + root->keyCount = 2; + root->parent = parent; + + int i; + for (i = 1; i <= treeOrder + 2; i++) { + root->value[i] = (int)NULL; // Typcast and wrap NULL into an int for equality purposes + root->keys[i] = NULL; + } + + return root; +} + +struct node* insertN(int value,struct node *root,struct node *parent){ + int i = 0, j; + + if (root == NULL){ // If the tree doesn't have a value yet + return newNode(value,parent); + } else { + while(1){ // Loop for inserting data in a node rect + if ( (void*)root->value[i] != NULL ){ // If there is a value in the current box + if (value == root->value[i]){ // If the value is already inserted + printf("Data Already inserted!\n"); + break; + } else if ( value > root->value[i] ){ // if value to be inserted is greater, then proceed to next box + if (root->keys[i+1] != NULL && root->keys[i+1]->keyCount < treeOrder + 1 && root->value[i+1] > value) { + PUT_RIGHT: + root->keys[i+1] = insertN(value,root->keys[i+1],root); + break; + } else i++; + + continue; + } else { // This is if the value to be inserted is lesser which means, we can put it now + if (root->keys[i] != NULL && root->keys[i]->keyCount < treeOrder + 1) { + PUT_LEFT: + root->keys[i] = insertN(value,root->keys[i],root); + break; + } else { + for (j = treeOrder - 2; j >= i; j--) { + root->value[j+1] = root->value[j]; // move everything to the right + root->keys[j+2] = root->keys[j+1]; + } + + root->value[i] = value; + root->keyCount++; + + printf("Keys: %d\n",root->keyCount); + break; + } + + } + } else { // else if the box is null or the last box. Insert directly + if (root->keys[i] != NULL && root->keys[i]->keyCount < treeOrder + 1) { + printf("Succes!\n"); + goto PUT_LEFT; + } + + root->value[i] = value; + root->keyCount++; + + printf("Keys: %d\n",root->keyCount); + break; + } + + i++; + } + + if (root->keyCount > treeOrder){ // Overflow + int left = (treeOrder-1)/2 - 1; // in Array position + int right = (treeOrder-1)/2 + 1; + int mid = (treeOrder-1)/2; + + printf("Overflow! Splitting and Promoting...\n"); + struct node *leftHalf = NULL; + struct node *rightHalf = NULL; + + for (i = 0; i <= left; i++){ // Move all left half data to new LeftHalf Box + leftHalf = insertN(root->value[i],leftHalf,NULL); // Set the parent to NULL temporarily + leftHalf->keys[i] = root->keys[i]; + } leftHalf->keys[left+1] = root->keys[left+1]; + + int j = 0; + for (i = right; i < treeOrder; i++, j++){ // Move all right half data to new LeftHalf Box + rightHalf = insertN(root->value[i],rightHalf,NULL); + rightHalf->keys[j] = root->keys[i]; + } rightHalf->keys[j] = root->keys[treeOrder]; + + + int pIsNull = parent == NULL ? 1 : 0; + struct node *tempRoot = root; + struct node *pParent = pIsNull ? NULL : parent->parent; + + pushS(leftHalf,rightHalf); + parent = insertN(root->value[mid],parent,pParent); + + struct splitStack *ss = popS(); + + if (pIsNull){ // Special case if splitted is the tRoot (The very Root) + ss->leftHalf->parent = parent; + ss->rightHalf->parent = parent; + parent->keys[0] = ss->leftHalf; + parent->keys[1] = ss->rightHalf; + + tRoot = parent; + //free(tempRoot); // Delete old root node box + + printf("\n\n"); + inOrder(parent); + printf("\n\n"); + + return parent; + + + } else { + // put left and right half properly + int max = findMax(ss->leftHalf); // Max of left half + struct nodePosition *position = searchNValue(max,tRoot); + + if (position != NULL){ + printf("\nLeft half Max %d is Found at key: %d\n",max,position->key); + } + + if (ss != NULL && position != NULL){ + // Find the parent of the current left and right box + int max = findMax(ss->leftHalf); + for (i = 0; i < position->box->parent->keyCount; i++){ + if (position->box->parent->keys[i] == position->box){ + printf("\nLeft half is: %d\n",ss->leftHalf->value[0]); + printf("Right half is: %d\n",ss->rightHalf->value[0]); + + position->box->parent->keys[i] = ss->leftHalf; + position->box->parent->keys[i+1] = ss->rightHalf; + + printf("Inserting Left half with Max of %d at key %d\n",max,i); + printf("Inserting Right half with Max of %d at key %d\n",ss->rightHalf->value[0],i+1); + + printf("Parent is %d\n",position->box->parent->value[i]); + + ss->leftHalf->parent = position->box->parent; + ss->rightHalf->parent = position->box->parent; + + if ( position->box->parent->value[i] > tempRoot->value[mid] ) return ss->rightHalf; + else return ss->leftHalf; + + break; + } + } + + } + + return ss->leftHalf; + } + + } + } + + return root; +} + +struct nodePosition* searchNValue(int value,struct node *root){ + int i; + struct nodePosition *nodeF = NULL; + if (root == NULL) return NULL; + else { + for (i = 0; i < root->keyCount; i++){ // -1 since left and right key of every data box + if (root->value[i] == value) { + nodeF = (struct nodePosition*)malloc(sizeof(struct nodePosition)); + nodeF->box = root; + nodeF->key = i; + return nodeF; + } + else if (nodeF != NULL) return nodeF; + else nodeF = searchNValue(value,root->keys[i]); + } + return nodeF; + } +} + +// Printing +void inOrder(struct node *root){ + int i; + if (root == NULL) return; + else { + //root = root->keys[1]->keys[2]; + for (i = 0; i < root->keyCount + 2; i++){ // -1 since left and right key of every data box + inOrder(root->keys[i]); + if (i < root->keyCount - 1) printf("~%d~\n",root->value[i]); + } + } +} + +void levelOrder(struct node *root){ + int i; + if (root == NULL) return; + else { + for (i = 0; i < root->keyCount - 1; i++){ // -1 since left and right key of every data box + printf("%d ",root->value[i]); + } + printf(" "); + if (root->parent == NULL) printf("\n"); + else { + for (i = 0; i < root->parent->keyCount + 2; i++){ // Check if had a right sibling, if none then proceed to next level + if (root->parent->keys[i] == root){ + if (root->parent->keys[i+1] == NULL) printf("\n"); + break; + } + } + } + + for (i = 0; i < root->keyCount; i++){ + levelOrder(root->keys[i]); + } + } +} + +void pushS(struct node *leftHalf, struct node *rightHalf){ + struct splitStack *newNode = (struct splitStack*)malloc(sizeof(struct splitStack)); + newNode->leftHalf = leftHalf; + newNode->rightHalf = rightHalf; + if (head == NULL){ + head = newNode; + head->next = NULL; + } else { + newNode->next = head; + head = newNode; + } +} + +struct splitStack *popS(){ + if (head == NULL) { + printf("Stack Underflow!!\n"); + return NULL; + } else { + struct splitStack *temp = head; + head = head->next; + return temp; + } +} + +int findMax(struct node *root){ + int i, max = root->value[0]; + for (i = 0; i < root->keyCount; i++){ + if (root->value[i] > max) max = root->value[i]; + } + + return max; +} + +int findMin(struct node *root){ + int i, min = root->value[0]; + for (i = 0; i < root->keyCount; i++){ + if (root->value[i] < min) min = root->value[i]; + } + + return min; +} diff --git a/btree.c b/btree.c index 5ffd8f9..6c237ff 100644 --- a/btree.c +++ b/btree.c @@ -15,23 +15,12 @@ struct nodePosition { struct node* box; }; -// Left-right stack for multiple splitting -struct splitStack { - struct node *leftHalf; - struct node *rightHalf; - struct splitStack *next; -} *head = NULL; - -void pushS(struct node *leftHalf, struct node *rightHalf); -struct splitStack *popS(); - // Globals int treeOrder; // Menu functions void showMenu(); void doInsert(); -void doDelete(); void doSearch(); void doInOrder(); @@ -42,7 +31,7 @@ struct nodePosition* searchNValue(int value,struct node *root); // Printing void inOrder(struct node *root); -void levelOrder(struct node *root); +void leftRightPrint(struct node *root); // Utils int findMax(struct node *root); @@ -72,16 +61,14 @@ void showMenu(){ printf("\n\n"); printf("(1) Insert a Node\n"); - printf("(2) Delete a Node\n"); - printf("(3) Search a Node\n"); - printf("(4) Print In Order\n"); - printf("(5) Exit\n"); + printf("(2) Search a Node\n"); + printf("(3) Print In Order\n"); + printf("(4) Exit\n"); switch(getch()){ case '1' : doInsert(); break; - case '2' : doDelete(); break; - case '3' : doSearch(); break; - case '4' : doInOrder(); break; + case '2' : doSearch(); break; + case '3' : doInOrder(); break; default : exit(0); } } @@ -103,15 +90,6 @@ void doInsert(){ showMenu(); } -void doDelete(){ - system("cls"); - printf("--- Deletion ---\n"); - - printf("\n\n\nPress any key to continue...\n"); - getch(); - showMenu(); -} - void doSearch(){ int toFind; @@ -137,8 +115,8 @@ void doInOrder(){ if (tRoot != NULL) inOrder(tRoot); else printf("\nThe tree is empty!\n"); - printf("--- Level Order ---\n"); - if (tRoot != NULL) levelOrder(tRoot); + printf("--- Left to Right Order ---\n"); + if (tRoot != NULL) leftRightPrint(tRoot); else printf("\nThe tree is empty!\n"); printf("\n\n\nPress any key to continue...\n"); @@ -190,7 +168,8 @@ struct node* insertN(int value,struct node *root,struct node *parent){ for (j = treeOrder - 2; j >= i; j--) { root->value[j+1] = root->value[j]; // move everything to the right root->keys[j+2] = root->keys[j+1]; - } + } + root->value[i] = value; root->keyCount++; @@ -240,16 +219,13 @@ struct node* insertN(int value,struct node *root,struct node *parent){ struct node *tempRoot = root; struct node *pParent = pIsNull ? NULL : parent->parent; - pushS(leftHalf,rightHalf); - parent = insertN(root->value[mid],parent,pParent); - - struct splitStack *ss = popS(); + parent = insertN(root->value[mid],parent,pParent); if (pIsNull){ // Special case if splitted is the tRoot (The very Root) - ss->leftHalf->parent = parent; - ss->rightHalf->parent = parent; - parent->keys[0] = ss->leftHalf; - parent->keys[1] = ss->rightHalf; + leftHalf->parent = parent; + rightHalf->parent = parent; + parent->keys[0] = leftHalf; + parent->keys[1] = rightHalf; tRoot = parent; //free(tempRoot); // Delete old root node box @@ -263,33 +239,42 @@ struct node* insertN(int value,struct node *root,struct node *parent){ } else { // put left and right half properly - int max = findMax(ss->leftHalf); // Max of left half + int max = findMax(leftHalf); // Max of left half struct nodePosition *position = searchNValue(max,tRoot); if (position != NULL){ - printf("Left half Max %d is Found at key: %d\n",max,position->key); + printf("\nLeft half Max %d is Found at key: %d\n",max,position->key); } - if (ss != NULL && position != NULL){ + if (position != NULL){ // Find the parent of the current left and right box - int max = findMax(ss->leftHalf); + int max = findMax(leftHalf); for (i = 0; i < position->box->parent->keyCount; i++){ if (position->box->parent->keys[i] == position->box){ - position->box->parent->keys[i] = ss->leftHalf; - position->box->parent->keys[i+1] = ss->rightHalf; + printf("\nLeft half is: %d\n",leftHalf->value[0]); + printf("Right half is: %d\n",rightHalf->value[0]); + + position->box->parent->keys[i] = leftHalf; + position->box->parent->keys[i+1] = rightHalf; - printf("Left half is: %d\n",ss->leftHalf->value[0]); - printf("Right half is: %d\n",ss->rightHalf->value[0]); + printf("Inserting Left half with Max of %d at key %d\n",max,i); + printf("Inserting Right half with Max of %d at key %d\n",rightHalf->value[0],i+1); + + printf("Parent is %d\n",position->box->parent->value[i]); + + leftHalf->parent = position->box->parent; + rightHalf->parent = position->box->parent; + + if ( position->box->parent->value[i] > tempRoot->value[mid] ) return rightHalf; + else return leftHalf; - ss->leftHalf->parent = position->box->parent; - ss->rightHalf->parent = position->box->parent; break; } } } - return ss->leftHalf; + return leftHalf; } } @@ -330,7 +315,7 @@ void inOrder(struct node *root){ } } -void levelOrder(struct node *root){ +void leftRightPrint(struct node *root){ int i; if (root == NULL) return; else { @@ -349,35 +334,11 @@ void levelOrder(struct node *root){ } for (i = 0; i < root->keyCount; i++){ - levelOrder(root->keys[i]); + leftRightPrint(root->keys[i]); } } } -void pushS(struct node *leftHalf, struct node *rightHalf){ - struct splitStack *newNode = (struct splitStack*)malloc(sizeof(struct splitStack)); - newNode->leftHalf = leftHalf; - newNode->rightHalf = rightHalf; - if (head == NULL){ - head = newNode; - head->next = NULL; - } else { - newNode->next = head; - head = newNode; - } -} - -struct splitStack *popS(){ - if (head == NULL) { - printf("Stack Underflow!!\n"); - return NULL; - } else { - struct splitStack *temp = head; - head = head->next; - return temp; - } -} - int findMax(struct node *root){ int i, max = root->value[0]; for (i = 0; i < root->keyCount; i++){ diff --git a/btree.exe b/btree.exe index d52c34b2099d4d9061fb308a22d26d0a693dce78..e165a75f0193aea658072d326a14d62dbb07cb6d 100644 GIT binary patch delta 8821 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 delta 9650 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