哈希表的构建实例
已知一组关键字为{19,14,23,01,68,20,84,27,55,11,10,79},按照哈希函数H(key) = key MOD 13和链地址法处理冲突构造哈希函数。
#include <stdio.h>
#include <stdlib.h>
#define hashSize 12
typedef struct key{
int data;
struct key *nextKey;
}keyList;
int main()
{
int key[] = {19,14,23,01,68,20,84,27,55,11,10,79};
keyList* p1 = NULL;
keyList hashTable[hashSize];
for(int i = 0;i<hashSize;i++)
hashTable[i].nextKey = NULL;
//构建哈希表
for(int i = 0;i<hashSize;i++)
{
int j = key[i]%13;//哈希函数
if(hashTable[j].nextKey == NULL)
{
//如果当前地址未被占用,则将关键字插入当前指针指向的链表
hashTable[j].nextKey = (keyList*)malloc(sizeof(keyList));
hashTable[j].nextKey->data = key[i];
hashTable[j].nextKey->nextKey = NULL;
}else{
//如果当前地址已被占用,则使用链表的尾项插入当前关键字
keyList *p = (keyList*)malloc(sizeof(keyList));
p->nextKey = hashTable[j].nextKey->nextKey;
p->data = key[i];
hashTable[j].nextKey->nextKey = p;
}
}
//输出hashTable[hashSize]的每个数组中元素指向的链表的个数
int num[12] = {0};
for(int i = 0;i<12;i++)
{
while(hashTable[i].nextKey)
{
hashTable[i].nextKey = hashTable[i].nextKey->nextKey;
num[i]++;
}
printf("%d ",num[i]);
}
return 1;
}
程序输出哈希表中每个数组含有的链表元素个数如下:
0 4 0 2 0 0 2 1 0 0 2 1
--------------------------------
Process exited after 0.064 seconds with return value 1
请按任意键继续. . .
关键字构造所得哈希表如下:


浙公网安备 33010602011771号