散列表的c语言程序,2.5.3 散列表的程序实现(1)

2.5.3 散列表的程序实现(1)

1.数据类型定义

在C语言中,我们把散列表定义成如下的结构体。1 typedef struct {/*hash表结构*/

2     LinkedList **table; /*槽位数组*/

3     size_t m; /*槽位数*/

4     size_t n; /*元素个数*/

5 } Hash_Table;

6 HashTable* createTable(int m); /*创建具有m个槽位的hash表*/

7 void clrTable(Hash_Table* t);

8 int tbIsEmpty(Hash_Table* t); /*检测表空*/

9 int hashInsert(Hash_Table* t, unsigned key); /*向表t中插入元素ele*/

10 int inHashTable(Hash_Table* t, unsigned key); /*在表t中查找关键值key*/

11 int hashDelete(Hash_Table* t, unsigned key); /*在表t中删除元素ele*/

程序2-23 定义散列表数据结构及声明操作函数的头文件hstb.h

对程序2-18的说明如下。

(1)第1行~第5行定义的是散列表类型HashTable。它有3个数据属性:槽位数组table,该数组的元素是存储表元素的链表;槽位数m和表内元素个数n,它们都是整型的。

(2)第6行、第7行声明的函数createTable和clrTable用来创建散列表和清理散列表的存储空间。第8行声明的函数tbIsEmpty用来检测散列表是否为空。

(3)第17行、第18行和第19行声明的函数inHashTable、hashInsert和hashDelete将分别实现算法2-24中的CHAINED-HASH-SEARCH、CHAINED- HASH-INSERT和CHAINED-HASH-DELETE过程等字典操作。

2.hash表的常规维护

hash表的常规维护操作包括创建空表、清理不再使用的表空间以及检测是否表空。这些操作的C函数定义如下。1 HashTable* createTable(int m) {

2     int i;

3     HashTable *tab= (Hash_Table *) malloc(sizeof (Hash_Table));/*分配空间*/

4     assert(tab);

5     tab->mm= m;/*设置槽位数*/

6     tab->table= (LinkedList**) malloc(m * sizeof (LinkedList*));/*分配槽位*/

7     assert(tab->table);

8     tab->n=0;/*元素个数初始化为*/

9     for (i=0; i

10        tab->table[i] = createList(sizeof(unsigned),intGreater);/*创建槽位链表*/

11    return tab;

12 }

13 void clrTable(Hash_Table* t) {

14    int i;

15    for (i=0; im; i++)

16        clrList(t->table[i], NULL); /*清理槽位链表*/

17    free(t->table);/*释放槽位*/

18 }

19 int tbIsEmpty(Hash_Table* t) {

20    return t->n== 0;

21 }

程序2-24 hash表的常规维护函数

对程序2-24的说明如下。

(1)第1行~第12行定义的函数createTable创建一个具有参数m个槽位的散列表(第6行)。第9~10行的for循环为每一个槽位创建一个链表存储整型数据的链表,因为hash表中元素的关键值是非负整数。

(2)第13~18行定义的函数clrTable对参数t指引的散列表清理存储空间。其中,第16行调用链表清理函数清理每个槽位链表,由于连表中存储的结点数据是普通的非负整数类型数据,无需对链表结点的key域做特殊处理,故传递给函数clrList的第2个参数为NULL。

(3)第19行~第21行定义的函数tbIsEmpty检测由参数t指引的散列表是否为空,它以t的n属性是否为0作为判断依据(第20行)。

【责任编辑:book TEL:(010)68476606】

点赞 0

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值