微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 硬件工程师文库 > 周立功来讲解哈希表的实现

周立功来讲解哈希表的实现

时间:08-30 来源:周立功单片机 点击:

_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++) {                   // 释放哈希表中各个表项中存储的所有结点

7            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);                                     // 释放链表头结点数组空间

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top