From 73dba84e82b255d92e7636411615e67f7bfe6cec Mon Sep 17 00:00:00 2001 From: YuQing <384681@qq.com> Date: Mon, 27 Apr 2020 14:16:00 +0800 Subject: [PATCH] uniq_skiplist_grow set prev link correctly --- src/tests/test_uniq_skiplist.c | 9 ++++++--- src/uniq_skiplist.c | 9 +++++++-- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/src/tests/test_uniq_skiplist.c b/src/tests/test_uniq_skiplist.c index ac07b95..173c6a9 100644 --- a/src/tests/test_uniq_skiplist.c +++ b/src/tests/test_uniq_skiplist.c @@ -228,15 +228,18 @@ static void test_reverse_iterator() { UniqSkiplistNode *node; int v; + int count; int *value; - v = 21; + printf("test_reverse_iterator\n"); + count = 0; + v = 2; node = uniq_skiplist_find_ge_node(sl, &v); if (node != NULL) { while (node != sl->top) { value = (int *)node->data; - printf("value: %d\n", *value); - node = (UniqSkiplistNode *)LEVEL0_DOUBLE_CHAIN_PREV_LINK(node); + printf("value[%d]: %d\n", count++, *value); + node = UNIQ_SKIPLIST_LEVEL0_PREV_NODE(node); } } } diff --git a/src/uniq_skiplist.c b/src/uniq_skiplist.c index 78b4b6a..27383de 100644 --- a/src/uniq_skiplist.c +++ b/src/uniq_skiplist.c @@ -236,8 +236,13 @@ static int uniq_skiplist_grow(UniqSkiplist *sl) sl->top_level_index = top_level_index; if (sl->factory->bidirection) { - LEVEL0_DOUBLE_CHAIN_TAIL(sl) = - LEVEL0_DOUBLE_CHAIN_PREV_LINK(old_top); + if (top->links[0] != sl->factory->tail) { //not empty + LEVEL0_DOUBLE_CHAIN_PREV_LINK(top->links[0]) = top; + LEVEL0_DOUBLE_CHAIN_TAIL(sl) = + LEVEL0_DOUBLE_CHAIN_PREV_LINK(old_top); + } else { + LEVEL0_DOUBLE_CHAIN_TAIL(sl) = sl->top; + } } UNIQ_SKIPLIST_FREE_MBLOCK_OBJECT(sl, old_top_level_index, old_top);