周立功来讲解哈希表的实现
_db_del(&hash_students, id);
在该函数的实现中,绝大部分操作与查找记录是相同的,唯一的不同是,当找到关键字对应的结点时,不再需要将记录值提取出来,直接将该结点删除即可。函数实现的范例详见程序清单3.66。
程序清单3.66 删除记录函数范例程序
1 int hash_db_del (hash_db_t *p_hash, const void *key)
2 {
3 int idx = p_hash->pfn_hash(key); // 得到关键字对应的哈希表的索引
4 struct _node_find_ctx info = {key, p_hash->key_len, NULL}; // 设置遍历链表的上下文信息
5 slist_foreach(&p_hash->p_head[idx], __hash_db_node_find, &info); // 遍历,寻找关键字对应结点
6 if (info.p_result != NULL) {7 slist_del(&p_hash->p_head[idx], info.p_result); // 从链表中删除该结点
8 free(info.p_result); // 释放结点空间
9 return 0;
10 }
11 return -1;
12 }5. 解初始化
对应于哈希表的初始化,用于当不再使用哈希表时,释放相关的空间。可以定义其函数名为:hash_db_deinit()。需要通过参数指定需要解初始化的哈希表实例,可以定义函数的原型为(hash_db.h):
int hash_db_deinit (hash_db_t *p_hash);
如不再使用学生信息管理系统,则需使用解初始化函数释放哈希表的相关资源,使用范例如下:
hash_db_deinit(&hash_students);
在该函数的实现中,需要释放程序中分配的所有空间,主要包括添加记录时分配的结点空间,链表头结点数组空间。函数实现详见程序清单3.67。
程序清单3.67 解初始化函数范例程序
1 int hash_db_deinit (hash_db_t *p_hash)
2 {
3 int i;
4 slist_node_t *p_node;
5 for (i = 0; i < p_hash->size; i++) { // 释放哈希表中各个表项中存储的所有结点
67 while (slist_begin_get(&p_hash->p_head[i]) != slist_end_get(&p_hash->p_head[i])) {
8 p_node = slist_begin_get(&p_hash->p_head[i]);
9 slist_del(&p_hash->p_head[i], p_node); // 删除第一个结点
10 free(p_node);
11 }
12 }
13 free(p_hash-> 13 free(p_hash->p_head); // 释放链表头结点数组空间
- 电源软启动的实用设计技巧(07-16)
- 周立功:动态分布内存——malloc()函数与calloc()函数(07-22)
- 周立功“程序设计与数据结构”:深度解剖动态分布内存的free()函数与realloc()函数(07-25)
- 周立功教你学程序设计技术:做好软件模块的分层设计,回调函数要这样写(07-30)
- 周立功教你学C语言编程:教你数组是如何保存指针的(07-31)
- 算法的泛化问题,这些坑你可能都经历过!|周立功教你学软件设计(08-01)