详见 清华大学出版社的《数据结构题集(C语言版)》 P166 6.2
哈希表采用数组形式实现,方便操作.
构造哈希表时对冲突的处理采用为随即再散列法,虽然这很容易实现,但是在插入和查找时得分开进行处理,否则会导致正确的hash被跳过去,只能生成未被占用的hash,导致查找的时候始终无法找到关键字.因此在CreateHash函数中加入了判断条件,除了比对该hash有没有被占用之外还要比对占用的关键字是否与生成hash的关键字相同.
代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct HashNode
{
char name[30];
int flag;
}HashNode;
HashNode HashTable[60];
void InsertHash(long int hash, char *name)
{
strcpy(HashTable[hash].name, name);
HashTable[hash].flag = 1;
}
int SearchHash(long int hash)
{
if (HashTable[hash].flag == 1)
return 1;
else
return 0;
}
long int CreateHash(char *name)
{
int i, n;
long int hash = 0;
n = strlen(name);
for (i = 0; i < n; i++)
{
hash += name[i];
}
hash = hash % 60;
while (SearchHash(hash) == 1 && strcmp(HashTable[hash].name, name) != 0)
hash = (hash + abs(rand())) % 60;
return hash;
}
void InitHashTable()
{
int i;
for (i = 0; i < 60; i++)
HashTable[i].flag = 0;
}
void main()
{
int temp;
char input[30] = "Initial";
InitHashTable();
printf("Input names below,end up inputting with \"E\"\n");
do
{
if (strlen(input) != 1)
{
scanf("%s", input);
getchar();
InsertHash(CreateHash(input), input);
}
}
while (strlen(input) != 1);
printf("\nSearch:");
scanf("%s", input);
do
{
temp = CreateHash(input);
if (SearchHash(temp) == 1 && strcmp(HashTable[temp].name, input) == 0)
{
printf("\nFound.\n");
getchar();
scanf("%d");
return;
}
}
while (SearchHash(temp) == 1);
printf("\nNot Found.\n");
getchar();
scanf("%s", input);
}