#define PRIME (7)
#define FAILED (-2)
#define NUL ('/0')
#define FALSE (0)
#define TRUE (1)
/* 数据类型定义 */
typedef char Name ;
typedef struct cell
{
Name name ;
int be_deleted ; // 在优先队列中是否是已删除过的
enum KindOfEntry entry ;
int index_in_adjacenty_list ;
} Cell ;
typedef struct hash_table
{
Cell * lists ;
int current ;
int capacity ;
} * Hash_Table ;
/* 接口函数声明 */
/* 操作: 根据一个数据产生一个数值并返回 */
/* 操作前: pht 指向一个已初始化的散列表, pname 指向一个数据 */
/* 操作后: 根据该数据产生一个数值并返回 */
/* 时间复杂度: O(1) */
int Hash (const Hash_Table * const pht, const Name * const pname) ;
/* 操作: 创建并初始化一个散列表 */
/* 操作前: pht 指向一个散列表, capacity 是指示表大小的数据 */
/* 操作后: 如果 capacity > 0 && 内存分配成功, 该散列表被创建为 >= capacity 最小素数大小并初始化为空, 返回1; 否则返回0 */
/* 时间复杂度: O(1) */
int Initialize_H (Hash_Table * const pht, const int capacity) ;
/* 操作: 查找并返回一个指向数据在散列表中的位置的指针 */
/* 操作前: pht 指向一个已初始化的散列表, pname 指向被查找的数据 */
/* 操作后: 如果找到数据域为 *pname 的元素, 返回指向该元素的指针; 否则返回指向查找结束时停止在散列表元素的指针 */
/* 时间复杂度: O(N) */
Cell * Find_H (const Hash_Table * const pht, const Name * const pname) ;
/* 操作: 向散列表中添加一个元素并返回在散列表中的索引 */
/* 操作前: pht 指向一个已初始化的散列表, pname 是指向名字的指针, index 是元素在邻接表中的索引 */
/* 操作后: 如果表当前大小 <= 表大小的一半, 添加该元素, 返回当前索引; 否则返回 FAILED */
/* 时间复杂度: O(N) */
int Insert_H (const Hash_Table * const pht, const Name * const pname, const int index) ;
/* 操作: 从散列表中懒惰删除数据域为指定数据的元素 */
/* 操作前: pht 指向一个已初始化的散列表, pname 是指向名字的指针 */
/* 操作后: 如果找到该元素, 对其进行懒惰删除, 返回 1 ; 否则返回 0 */
/* 时间复杂度: O(N) */
int Delete_H (const Hash_Table * const pht, const Name * const pname) ;
/* 操作: 释放一个散列表所占用的内存空间 */
/* 操作前: pht 指向一个已初始化的散列表 */
/* 操作后: 该散列表所占内存空间被释放 */
/* 时间复杂度: O(1) */
void Release_H (const Hash_Table * const pht) ;