提交 5ffd4207 编写于 作者: H hzcheng

more

上级 2b927cb7
#include <stdlib.h>
#include "skiplist.h"
#define IS_VALID_SKIPLIST_DUPLICATE_KEY_STRATEGY(strategy) \
(((strategy) >= SKIPLIST_ALLOW_DUPLICATE_KEY) && ((strategy) <= SKIPLIST_DISCARD_DUPLICATE_KEY))
SSkipListNode *tdCreateSkiplistNode(int32_t nlevels) {
SSkipListNode *pNode = (SSkipListNode *)malloc(sizeof(SSkipListNode));
if (pNode == NULL) return NULL;
pNode->nexts = (struct _skiplist_node **)cmalloc(nlevels, sizeof(struct _skiplist_node *));
if (pNode->nexts == NULL) {
free(pNode);
return NULL;
}
pNode->prevs = (struct _skiplist_node **)cmalloc(nlevels, sizeof(struct _skiplist_node *));
if (pNode->nexts == NULL) {
free(pNode->nexts);
free(pNode);
return NULL;
}
return pNode;
}
int32_t tdFreeSkiplistNode(SSkipListNode *pNode) {
if (pNode == NULL) return 0;
// TODO: free key and free value
// Free the skip list
free(pNode->nexts);
free(pNode->prevs);
free(pNode);
return 0;
}
SSkipList *tdCreateSkiplist(int16_t nMaxLevels, SKIPLIST_DUPLICATE_KEY_STATEGY strategy) {
// Check parameters
if (!IS_VALID_SKIPLIST_DUPLICATE_KEY_STRATEGY(strategy)) return NULL;
SSkipList *pSkipList = (SSkipList *)malloc(sizeof(SSkipList));
if (pSkipList == NULL) {
return NULL;
}
pSkipList->strategy = strategy;
pSkipList->nMaxLevels = nMaxLevels;
pSkipList->head = tdCreateSkiplistNode(nMaxLevels);
if (pSkipList->head == NULL) {
free(pSkipList);
return NULL;
}
return pSkipList;
}
int32_t tdFreeSkipList(SSkipList *pSkipList) {
if (pSkipList == NULL) return 0;
SSkipListNode *pNode = pSkipList->head->nexts[0];
while (pNode) {
SSkipListNode *pTemp = pNode->nexts[0];
tdFreeSkiplistNode(pNode);
pNode = pTemp;
}
free(pSkipList);
return 0;
}
\ No newline at end of file
#if !defined(_TD_SKIPLIST_H)
#define _TD_SKIPLIST_H
#include <stdint.h>
typedef enum {
SKIPLIST_ALLOW_DUPLICATE_KEY,
SKIPLIST_REPLACE_DUPLICATE_KEY,
SKIPLIST_DISCARD_DUPLICATE_KEY
} SKIPLIST_DUPLICATE_KEY_STATEGY;
typedef struct _skiplist_node {
void * key;
void * value;
struct _skiplist_node **nexts;
struct _skiplist_node **prevs;
} SSkipListNode;
// To implement a general skip list
typedef struct _skiplist {
SKIPLIST_DUPLICATE_KEY_STATEGY strategy;
SSkipListNode * head;
SSkipListNode * tail;
int32_t nMaxLevels;
int32_t count;
} SSkipList;
// -- Operations on SSkipListNode
SSkipListNode *tdCreateSkiplistNode(int32_t nlevels);
int32_t tdFreeSkiplistNode(SSkipListNode *pNode);
// -- Operations on SSkipList
SSkipList *tdCreateSkiplist(int16_t nMaxLevels, SKIPLIST_DUPLICATE_KEY_STATEGY strategy);
int32_t tdFreeSkipList(SSkipList *pSkipList);
// int32_t tdAddItemToSkiplist(SSkipList *slist, void *key, void *value);
// int32_t tdAddNodeToSkiplist(SSkipList *slist, SSkipListNode *node);
#endif // _TD_SKIPLIST_H
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册