-
Notifications
You must be signed in to change notification settings - Fork 0
Home
ckdkambh edited this page Mar 29, 2020
·
1 revision
在uthash中,并不会对其所储存的值进行移动或者复制,也不会进行内存的释放。
typedef struct {
UT_hash_handle handle; // handle,不用初始化
long long key; // key
char data[100]; // data
} MyHash;
- hash需要定义头节点,可以使用全局变量
MyHash *g_hashHead = NULL; // 头节点一定要初始化成空指针
void AddNode(long long key, char *data)
{
MyHash node = { 0 };
node.key = key;
memcpy(node.data, data, sizeof(char) * 100);
HASH_ADD(handle, g_hashHead, key, sizeof(long long), &node);
}
| macro | arguments |
|---|---|
| HASH_ADD | (hh_name, head, keyfield_name, key_len, item_ptr) |
void FindNode(long long key)
{
MyHash *node;
HASH_FIND(handle, g_hashHead, &key, sizeof(long long), node);
printf("%lld, %s", node->key, node->data);
}
查找不到key时,返回NULL
| macro | arguments |
|---|---|
| HASH_FIND | (hh_name, head, key_ptr, key_len, item_ptr) |
推荐该方式,也可以使用UT_hash_handle handle里的next, prev指针做类似双向链表的遍历。
VOID PrintNode()
{
MyHash *currNode, *tmp;
HASH_ITER(handle, g_hashHead, currNode, tmp) {
printf("key:%lld, data:%s", currNode->key, currNode->data);
}
}
| macro | arguments |
|---|---|
| HASH_ITER | (hh_name, head, item_ptr, tmp_item_ptr) |
VOID DeleteNode(MyHash *nodeToDelete)
{
HASH_DELETE(handle, g_hashHead, nodeToDelete);
}
| macro | arguments |
|---|---|
| HASH_DELETE | (hh_name, head, item_ptr) |
HASH_CLEAR(handle, g_hashHead)
| macro | arguments |
|---|---|
| HASH_CLEAR | (hh_name, head) |
HASH_CNT(handle, g_hashHead)
| macro | arguments |
|---|---|
| HASH_CNT | (hh_name, head) |
typedef struct {
UT_hash_handle handle; // handle,不用初始化
int key; // key
char data[100]; // data
} MyIntHash;
- hash需要定义头节点,可以使用全局变量
MyIntHash *g_intHashHead = NULL; // 头节点一定要初始化成空指针
void AddNode(int key, char *data)
{
MyIntHash node = { 0 };
node.key = key;
memcpy(node.data, data, sizeof(char) * 100);
HASH_ADD_INT(g_intHashHead, key, &node);
}
| macro | arguments |
|---|---|
| HASH_ADD_INT | (head, keyfield_name, item_ptr) |
void FindNode(int key)
{
MyIntHash *node;
HASH_FIND_INT(g_intHashHead, &key, node);
printf("%d, %s", node->key, node->data);
}
查找不到key时,返回NULL
| macro | arguments |
|---|---|
| HASH_FIND_INT | (head, key_ptr, item_ptr) |
同通用hash的遍历方式
同通用hash的删除方式
typedef struct {
UT_hash_handle handle; // handle,不用初始化
char key[20]; // key
char data[100]; // data
} MyStrHash;
- hash需要定义头节点,可以使用全局变量
MyStrHash *g_strHashHead = NULL; // 头节点一定要初始化成空指针
void AddNode(char *key, char *data)
{
MyStrHash node = { 0 };
strcpy(node.key, key);
memcpy(node.data, data, sizeof(char) * 100);
HASH_ADD_STR(g_strHashHead, key, &node);
}
| macro | arguments |
|---|---|
| HASH_ADD_STR | (head, keyfield_name, item_ptr) |
void FindNode(char *key)
{
MyStrHash *node;
HASH_FIND_STR(g_strHashHead, key, node);
printf("%s, %s", node->key, node->data);
}
查找不到key时,返回NULL
| macro | arguments |
|---|---|
| HASH_FIND_STR | (head, key_ptr, item_ptr) |
同通用hash的遍历方式
同通用hash的删除方式
typedef struct {
UT_hash_handle handle; // handle,不用初始化
void *key; // key
char data[100]; // data
} MyPointHash;
- hash需要定义头节点,可以使用全局变量
MyPointHash *g_pointHashHead = NULL; // 头节点一定要初始化成空指针
void AddNode(void *key, char *data)
{
MyPointHash node = { 0 };
node.key = key;
memcpy(node.data, data, sizeof(char) * 100);
HASH_ADD_PTR(g_strHashHead, key, &node);
}
| macro | arguments |
|---|---|
| HASH_ADD_PTR | (head, keyfield_name, item_ptr) |
void FindNode(void *key)
{
MyStrHash *node;
HASH_FIND_PTR(g_strHashHead, &key, node);
printf("%p, %s", node->key, node->data);
}
查找不到key时,返回NULL
| macro | arguments |
|---|---|
| HASH_FIND_PTR | (head, key_ptr, item_ptr) |
同通用hash的遍历方式
同通用hash的删除方式
| macro | arguments |
|---|---|
| HASH_DEL | (head, item_ptr) |
| HASH_SORT | (head, cmp) |
| HASH_COUNT | (head) |