1.保留除数法
哈希表保留除数法又称质数除余法,设Hash表空间长度为m,选取一个不大于m的最大质数。
示例:key = 962148,哈希表大小m = 25,取质数23。哈希函数hash (key) = key % 23 = 12。
2.冲突的处理
链地址法:
3.节点和数组定义
cpp
#define N 15
typedef int datatype;
typedef struct node
{
datatype key;
datatype value;
struct node *next;
}listnode,*linklist;
typedef struct
{
listnode data[N];
}hash;
创建
cpp
hash *hash_create()
{
hash *HT;
//malloc
if((HT = (hash *)malloc(sizeof(hash))) == NULL)
{
printf("malloc failed\n");
return NULL;
}
//init
memset(HT,0,sizeof(hash));
//return
return HT;
}
插入
cpp
int hash_insert(hash *HT,datatype key)
{
linklist p;
linklist q;
if(HT == NULL)
return -1;
if((p = (linklist)malloc(sizeof(listnode))) == NULL)
{
printf("malloc failed\n");
return -1;
}
p->key = key;//保存插入的值
p->value = key % N;//计算出有效值
p->next = NULL;//初始化
q = &(HT->data[key % N]);//保存找到的有效值地址,也就是链头
while(q->next && q->next->key > key)
{
q = q->next;//继续往下寻找
}
p->next = q->next;//插入
q->next = p;
return 0;
}
查找
cpp
linklist hash_search(hash *HT,datatype key)
{
linklist p;
if(HT == NULL)
return NULL;
p = &(HT->data[key % N]);//保存key的有效值的地址
while(p->next && p->next->key != key)//进行比较
{
p = p->next;
}
if(p->next == NULL)//没有找到
{
printf("no find\n");
return NULL;
}
else//找到了,p->next->key == key
{
printf("find\n");
return p->next;
}
}