/// Chapter11.h: 第11章数据结构
typedef int keyType; //以int类型作为散列值类型
typedef char dataType; //以char类型作为数据类型
const int HASH_TABLE_LENGTH = 20;
//令表长为20
const int MODDER = 17; //用作求余数的素数
const dataType EMPTY_CHAR = '/0'; //空的数据值的标志
const keyType EMPTY_KEY = -1; //空的散列值的标志
//散列表的定义
typedef struct hashChain
//"拉链"的定义,实际上就是一个单链表的定义
{
//keyType key; //该节点的散列值(真是没用啊,明明散列值都一样,为什么还要写一遍呢?)
dataType data; //该节点的数据值
struct hashChain* pNext; //指向下一个散列"拉链"的指针
}hashChain;
typedef struct hashNode
//散列表的主表,实际上就只有一个hashChain类型的指针域
{
keyType key; //该节点的散列值
hashChain* pChain; //该散列值对应的链表头地址
}hashNode;
/// 以下是函数声明
//
//以下是访问自定义数据类型的函数
//
void printKeyType(const keyType key);
void printDataType(const dataType data);
void printHashTable( hashNode* head, const int size);
//显示以head为首,长度为size的hashNode表的内容的函数
//
//以下是处理自定义数据结构的函数
//
void initializeHashChain(hashChain* chain);
//初始化一个hashChain节点的函数
void initializeHashNodes(hashNode* head, const int size);
//初始化一个hashNode节点的函数
hashNode* createHashTable(hashNode* head, const int size, const int totalNumber);
//建立初始长度为size的散列表,并返回其首地址的函数
//不成功则返回NULL
keyType getHash(const dataType data);
//从data算出hash值的函数
hashChain* newHashChain();
//分配新的hashChain节点的函数
hashNode* chainSearch(hashNode* head, const int size, const dataType data);
//在以head为首,长度为size的hashNode表中查找data,并返回其Node地址的函数
//不成功则返回NULL
hashChain* insertIntoChain(hashNode* head, const int size, const dataType data);
//在以head为首,长度为size的hashNode表中插入值为data的节点的函数
//成功则返回其地址,否则返回NULL
void freeHashTable(hashNode* head, const int size);
//释放以head为首,长度为size的hashNode表所占用的空间的函数