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