more
This commit is contained in:
parent
2b927cb78a
commit
5ffd4207ae
|
@ -1,73 +0,0 @@
|
||||||
#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;
|
|
||||||
}
|
|
|
@ -1,38 +0,0 @@
|
||||||
#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
|
|
Loading…
Reference in New Issue