C - linklist 用法 - btree

使用 btree 的方式儲存資料,可用來排序,或搜尋... 


定義


BTREE *bt_init(AD_COMPARE_FUNC *compFunc); // 初始化 btree
BTREE *bt_add(BTREE *bt, void *newitem); // 增加資料
void *bt_find(BTREE *bt, void *key, AD_LOCK lock_f); // 找資料
void *bt_traverse(BTREE *bt, AD_LOCK lock_f, AD_TRAVERSE_ORDER order, AD_TRAV_FUNC *travFunc, void *param);
void *bt_delete(BTREE *bt, void *key); // 刪除資料
void bt_free(BTREE *bt); // 釋放 btree
unsigned bt_count(BTREE *bt); // 回傳 bt 數量
AD_BOOLEAN bt_empty(BTREE *bt); // 是否為空陣列

  

用法

新增資料


struct BT_DATA { // 要丟進 btree 的資料內容
char *name;
int val;
};
static AD_RELATION dataBTCompare(void *This, void *Prev)
{
int result = 0;
struct BT_DATA *thisVal = ((struct BT_DATA *)This);
struct BT_DATA *prevVal = ((struct BT_DATA *)Prev);
result = strcmp(thisVal->name, prevVal->name);
if(result > 0) {
result = AD_GREATER_THAN;
} else if(result < 0) {
result = AD_LESS_THAN;
} else
result = AD_EQUAL;
return result;
}
void data_replace(BTREE *bt, char *name, int val) { // 增加或修改值
struct BT_DATA btData, *_btData;
memset(&btData, '\0', sizeof(struct BT_DATA));
btData.name = name;
// 先找看看是不是已經加入一樣的key, 判斷方式如 data_compare
if ((_btData = bt_find(bt, (void *)&btData, AD_NEED_LOCK))) { // 依照 bt_init 給的 func key
// 已加過,就直接改值
_btData->val = val;
} else if((_btData = calloc(1, sizeof(struct BT_DATA)))) {
// 沒加過,添加進 btree 結構裡
_btData->name = strdup(btData.name);
_btData->count = val;
bt_add(bt, _btData);
}
}
static AD_BOOLEAN freeBTTraverse(void *data, void *param)
{
if(data) {
struct BT_DATA *_btData = (struct BT_DATA *)data;
free(_btData->name);
free(_btData);
}
return AD_TRUE;
}
int main(int argc, char **argv) {
BTREE *bt = bt_init(dataBTCompare);

data_add(bt, "aaa", 50); // 增加或修改值
data_add(bt, "bbb", 50); // 增加或修改值

// 釋放記憶體
bt_traverse(bt, AD_NEED_LOCK, AD_IN_ORDER, freeBTTraverse, NULL);
bt_free(bt);

return 0;
}


找資料


void getData(BTREE *bt, char *name) {
struct BT_DATA btData, *_btData;
memset(&btData, '\0', sizeof(struct BT_DATA));
btData.name = name;
if ((_btData = bt_find(ll, &btData, AD_NEED_LOCK))) {
// 有找到這個key的話,會進這裡

}
}


刪除資料


void deleteData(BTREE *bt, char *name) {
struct BT_DATA btData, *_btData;
memset(&btData, '\0', sizeof(struct BT_DATA));
btData.name = name;
if ((_btData = bt_delete(ll, &btData))) {
// 有找到這個key的話,會進這裡,並從陣列移除

}
}


歷遍資料


static AD_BOOLEAN freeBTTraverse(void *data, void *param)
{
if(data) {
struct BT_DATA *_btData = (struct BT_DATA *)data;
free(_btData->name);
free(_btData);
}
return AD_TRUE;
}
void data_free(BTREE *bt) {
struct BT_DATA btData;
bt_traverse(bt, AD_NEED_LOCK, AD_IN_ORDER, freeBTTraverse, (void *)&btData);
}



後面附上這個 lib 的原始碼
linklist.h 原始碼
btree.c 原始碼
(這原始碼已不知道從何來的,侵權請告知,我會將它刪除,謝謝。也很感謝這位原作者)


沒有留言:

張貼留言