Skip to content

Commit 31cb030

Browse files
committed
fixed insert counting err; couting with del
1 parent 503312b commit 31cb030

File tree

2 files changed

+20
-17
lines changed

2 files changed

+20
-17
lines changed

kavl.h

Lines changed: 19 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -85,18 +85,13 @@ int main(void) {
8585
while (p != 0) { \
8686
int cmp; \
8787
cmp = __cmp(x, p); \
88+
if (cmp >= 0) cnt += kavl_size_child(__head, p, 0) + 1; \
8889
if (cmp < 0) p = p->__head.p[0]; \
89-
else if (cmp > 0) { \
90-
cnt += kavl_size_child(__head, p, 0) + 1; \
91-
p = p->__head.p[1]; \
92-
} else { \
93-
cnt += kavl_size_child(__head, p, 0) + 1; \
94-
if (cnt_) *cnt_ = cnt; \
95-
return (__type*)p; \
96-
} \
90+
else if (cmp > 0) p = p->__head.p[1]; \
91+
else break; \
9792
} \
9893
if (cnt_) *cnt_ = cnt; \
99-
return 0; \
94+
return (__type*)p; \
10095
}
10196

10297
#define __KAVL_ROTATE(suf, __type, __head) \
@@ -144,13 +139,13 @@ int main(void) {
144139
for (p = bp, q = bq, top = path_len = 0; p; q = p, p = p->__head.p[which]) { \
145140
int cmp; \
146141
cmp = __cmp(x, p); \
142+
if (cmp >= 0) cnt += kavl_size_child(__head, p, 0) + 1; \
147143
if (cmp == 0) { \
148-
if (cnt_) *cnt_ = cnt + 1; \
144+
if (cnt_) *cnt_ = cnt; \
149145
return p; \
150146
} \
151147
if (p->__head.balance != 0) \
152148
bq = q, bp = p, top = 0; \
153-
if (cmp > 0) cnt += kavl_size_child(__head, p, 0) + 1; \
154149
stack[top++] = which = (cmp > 0); \
155150
path[path_len++] = p; \
156151
} \
@@ -178,24 +173,32 @@ int main(void) {
178173
}
179174

180175
#define __KAVL_ERASE(suf, __scope, __type, __head, __cmp) \
181-
__scope __type *kavl_erase_##suf(__type **root_, const __type *x) { \
176+
__scope __type *kavl_erase_##suf(__type **root_, const __type *x, unsigned *cnt_) { \
182177
__type *p, *path[KAVL_MAX_DEPTH], fake; \
183178
unsigned char dir[KAVL_MAX_DEPTH]; \
184179
int i, d = 0, cmp; \
180+
unsigned cnt = 0; \
185181
fake.__head.p[0] = *root_, fake.__head.p[1] = 0; \
182+
if (cnt_) *cnt_ = 0; \
186183
if (x) { \
187184
for (cmp = -1, p = &fake; cmp; cmp = __cmp(x, p)) { \
188185
int which = (cmp > 0); \
186+
if (cmp > 0) cnt += kavl_size_child(__head, p, 0) + 1; \
189187
dir[d] = which; \
190188
path[d++] = p; \
191189
p = p->__head.p[which]; \
192-
if (p == 0) return 0; \
190+
if (p == 0) { \
191+
if (cnt_) *cnt_ = 0; \
192+
return 0; \
193+
} \
193194
} \
195+
cnt += kavl_size_child(__head, p, 0) + 1; /* because p==x is not counted */ \
194196
} else { \
195-
for (p = &fake; p; p = p->__head.p[0]) \
197+
for (p = &fake, cnt = 1; p; p = p->__head.p[0]) \
196198
dir[d] = 0, path[d++] = p; \
197199
p = path[--d]; \
198200
} \
201+
if (cnt_) *cnt_ = cnt; \
199202
for (i = 1; i < d; ++i) --path[i]->__head.size; \
200203
if (p->__head.p[1] == 0) { /* ((1,.)2,3)4 => (1,3)4; p=2 */ \
201204
path[d-1]->__head.p[dir[d-1]] = p->__head.p[0]; \
@@ -339,8 +342,8 @@ int main(void) {
339342
*
340343
* @return node removed from the tree if present, or NULL if absent
341344
*/
342-
#define kavl_erase(suf, proot, x) kavl_erase_##suf(proot, x)
343-
#define kavl_erase_first(suf, proot) kavl_erase_##suf(proot, 0)
345+
#define kavl_erase(suf, proot, x, cnt) kavl_erase_##suf(proot, x, cnt)
346+
#define kavl_erase_first(suf, proot) kavl_erase_##suf(proot, 0, 0)
344347

345348
#define kavl_itr_t(suf) struct kavl_itr_##suf
346349

test/kavl_test.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ int main(void)
8888
shuffle(n, buf);
8989
for (i = 0; i < n/2; ++i) {
9090
t.key = buf[i];
91-
q = kavl_erase(my, &root, &t);
91+
q = kavl_erase(my, &root, &t, 0);
9292
if (q) free(q);
9393
check(root, &h);
9494
}

0 commit comments

Comments
 (0)