哈希表的数据结构
#define SUCCESS 1 #define UNSUCCESS 0 #define HASHSIZE 12 /*定义散列表的长为数组的长度*/ #define NULLKEY -32768 typedef struct HashTable { int *elem; /*数据元素存储基址,动态分配数组*/ int count; /*当前数据元素个数*/ }HashTable; int m = 0; /*散列表表长,全局变量*/初始化哈希表
int InitHashTable(HashTable *H) { int i; m = HASHSIZE; H->count = m; H->elem = (int*)malloc(m * sizeof(int)); for (i = 0; i < m; i++) H->elem[i] = NULLKEY; return 0; }哈希函数
int Hash(int key) { return key%m;/*除留余数法*/ }插入关键字进入哈希表
void InsertHash(HashTable *H, int key) { int addr = Hash(key); /*求散列地址*/ while (H->elem[addr] != NULLKEY) /*如果不为空则冲突*/ addr = (addr + 1) % m; H->elem[addr] = key; /*直到有空位后插入关键字*/ }哈希表查找关键字
int SearchHash(HashTable H, int key, int *addr) { *addr = Hash(key); /*求散列地址*/ while (H.elem[*addr] != key) { *addr = (*addr + 1) % m; /*开放定址法*/ if (H.elem[*addr] == NULLKEY || *addr == Hash(key)) { /*循环回未找到或者回到原点*/ return UNSUCCESS; } } return SUCCESS; }
