diff options
author | cathook <cat.hook31894@gmail.com> | 2013-12-20 02:20:31 +0800 |
---|---|---|
committer | cathook <cat.hook31894@gmail.com> | 2013-12-20 02:20:31 +0800 |
commit | 4b296c4e6c97b2c498a3e8a80b26f2024b772d53 (patch) | |
tree | 114f486222ceb62bfede8212c17ec3621585dc09 | |
parent | fa826bc9ae9e59ccfdab8a9f5d3ae2d825482e68 (diff) | |
download | ctl-4b296c4e6c97b2c498a3e8a80b26f2024b772d53.tar.gz ctl-4b296c4e6c97b2c498a3e8a80b26f2024b772d53.tar.zst ctl-4b296c4e6c97b2c498a3e8a80b26f2024b772d53.zip |
fix little bug
-rw-r--r-- | inc/sptree.h | 8 | ||||
-rw-r--r-- | src/sptree.c | 16 | ||||
-rw-r--r-- | test.c | 54 |
3 files changed, 69 insertions, 9 deletions
diff --git a/inc/sptree.h b/inc/sptree.h index 577d08c..baec7e5 100644 --- a/inc/sptree.h +++ b/inc/sptree.h @@ -24,7 +24,7 @@ pvoid ctl_sptree_mergeX(ppvoid sp1, ppvoid sp2); void ctl_sptree_clearX(ppvoid sp); //void ctl_sptree_copyX (ppvoid sp, ppvoid sp2); -#define ctl_sptree_init(A,B,C,D) ctl_sptree_initX(ppVoid(A),B,C,(key_cmp)D) +#define ctl_sptree_init(A,B,C,D) ctl_sptree_initX(ppVoid(A),B,C,(ctl_spt_cmp)D) #define ctl_sptree_free(A) ctl_sptree_freeX(ppVoid(A)) #define ctl_sptree_isEmpty(A) ctl_sptree_isEmptyX (ppcVoid(A)) @@ -36,9 +36,9 @@ void ctl_sptree_clearX(ppvoid sp); #define ctl_sptree_del(A,B) ctl_sptree_delX (ppVoid(A),pcVoid(B)) #define ctl_sptree_update(A,B,C) ctl_sptree_updateX(ppVoid(A),pcVoid(B),pvoid(C)) -#define ctl_sptree_split(A,B,C,D) ctl_sptree_split(ppVoid(A),pcVoid(B),\ - ppVoid(C),pcVoid(D)) -#define ctl_sptree_merge(A,B) ctl_sptree_merge(ppVoid(A),ppVoid(B)) +#define ctl_sptree_split(A,B,C,D) ctl_sptree_splitX(ppVoid(A),pcVoid(B),\ + ppVoid(C),pcVoid(D)) +#define ctl_sptree_merge(A,B) ctl_sptree_mergeX(ppVoid(A),ppVoid(B)) #define ctl_sptree_clear(A) ctl_sptree_clearX(ppVoid(A)) //#define ctl_sptree_copy(A,B) ctl_sptree_copyX (ppVoid(A),ppVoid(B)) diff --git a/src/sptree.c b/src/sptree.c index 08d5203..378f216 100644 --- a/src/sptree.c +++ b/src/sptree.c @@ -70,6 +70,8 @@ pvoid ctl_sptree_initX(ppvoid sp, uint k_size, uint v_size, ctl_spt_cmp f){ head->val_size = v_size; head->root = NULL; head->func = f; + if(*sp != NULL) + *sp = pVoid(head); return pVoid(head); } pvoid ctl_sptree_freeX(ppvoid sp){ @@ -100,8 +102,9 @@ uint ctl_sptree_getValSizeX(ppcvoid sp){ pvoid ctl_sptree_findX(ppvoid sp, pcvoid key){ SplayTree* head = getHeader(*sp); int t = 1; - if(head->root != NULL) + if(head->root != NULL){ head->root = acces(head->func, head->root, key, &t); + } if(t == 0) return head->root->val; else @@ -165,8 +168,8 @@ void ctl_sptree_splitX(ppvoid sp , pcvoid key, ppvoid l, ppvoid r){ SplayTreeNode* righ; if(head->root != NULL){ split(head->func, head->root, key, &left, &righ); - getHeader(*r)->root = left; - getHeader(*l)->root = righ; + getHeader(*l)->root = left; + getHeader(*r)->root = righ; head->root = NULL; } ctl_sptree_freeX(sp); @@ -230,11 +233,12 @@ ctl_priv SplayTreeNode* split(ctl_spt_cmp f, SplayTreeNode* nd, pcvoid k, if(ret >= 0){ *l = nd; *r = nd->rchd; + disconnR(nd); }else{ *l = nd->lchd; *r = nd; + disconnL(nd); } - disconnL(nd); return (ret == 0 ? *l : NULL); } ctl_priv SplayTreeNode* merge(SplayTreeNode* l, SplayTreeNode* r){ @@ -308,9 +312,10 @@ ctl_priv void splay_r(SplayTreeNode* m, SplayTreeNode* f, SplayTreeNode* g){ /********************* # for debug ************************/ #include <stdio.h> +#include <unistd.h> ctl_priv void dump_node(SplayTreeNode* now){ if(now == NULL) return ; - printf("now = (%5.1f, %2d) ", *(double*)now->key, *(int*)now->val); + printf("now = (%5.1f, %2d) %lld ", *(double*)now->key, *(int*)now->val, now); if(now->lchd == NULL) printf("lchd = ( NULL) "); else printf("lchd = (%5.1f, %2d) ", *(double*)now->lchd->key, *(int*)now->lchd->val); if(now->rchd == NULL) printf("rchd = ( NULL) "); @@ -320,4 +325,5 @@ ctl_priv void dump_node(SplayTreeNode* now){ printf("\n"); dump_node(now->lchd); dump_node(now->rchd); + fflush(stdout); } @@ -0,0 +1,54 @@ +#include "sptree.h" +#include <stdio.h> + +int fcmp(const double* a, const double* b){ + if(*a < *b) return -1; + if(*a > *b) return 1; + return 0; +} + +int main(){ + void* ptr, *ptrl, *ptrr; + double key; int val, i; + ctl_sptree_init(&ptr, sizeof(double), sizeof(int), fcmp); + + for(i = 0; i < 5; i++){ + key = i, val = i + 5; + ctl_sptree_add(&ptr, &key, &val); + } + printf("before\n"); + key = 0; + val = *(int*)ctl_sptree_find(&ptr, &key); + printf("key = %.2f, %d\n", key, val); + key = 3; + ctl_sptree_del(&ptr, &key); + key = 0; + val = *(int*)ctl_sptree_find(&ptr, &key); + printf("key = %.2f, %d\n", key, val); + + printf("+++++++++\n"); + key = 2.7; + ctl_sptree_split(&ptr, &key, &ptrl, &ptrr); + + key = 4; + val = *(int*)ctl_sptree_find(&ptrr, &key); + printf("after\n"); + printf("key = %.2f, %d\n", key, val); + key = 4; ctl_sptree_del(&ptrr, &key); + + ptr = ctl_sptree_merge(&ptrl, &ptrr); + printf("=========\n"); + + for(i = 0; i < 5; i++){ + key = i + 0.2, val = i + 5; + ctl_sptree_add(&ptr, &key, &val); + } + + key = 2.2; + val = *(int*)ctl_sptree_find(&ptr, &key); + printf("key = %.2f, %d\n", key, val); + + + ctl_sptree_free(&ptr); + return 0; +} |