aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorcathook <cat.hook31894@gmail.com>2013-12-20 02:20:31 +0800
committercathook <cat.hook31894@gmail.com>2013-12-20 02:20:31 +0800
commit4b296c4e6c97b2c498a3e8a80b26f2024b772d53 (patch)
tree114f486222ceb62bfede8212c17ec3621585dc09
parentfa826bc9ae9e59ccfdab8a9f5d3ae2d825482e68 (diff)
downloadctl-4b296c4e6c97b2c498a3e8a80b26f2024b772d53.tar.gz
ctl-4b296c4e6c97b2c498a3e8a80b26f2024b772d53.tar.zst
ctl-4b296c4e6c97b2c498a3e8a80b26f2024b772d53.zip
fix little bug
-rw-r--r--inc/sptree.h8
-rw-r--r--src/sptree.c16
-rw-r--r--test.c54
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);
}
diff --git a/test.c b/test.c
index e69de29..0e692de 100644
--- a/test.c
+++ b/test.c
@@ -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;
+}