哈希表存人名。。= =

Posted on 2010-12-20 14:17  Kanone  阅读(966)  评论(0编辑  收藏  举报

详见 清华大学出版社的《数据结构题集(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);
}