固软一部通过工号查名字,哈希法实现。假设不考虑哈希值重复的情况。
在已有代码HashFindName.c基础上,只修改GetHaskKey函数即可。
#include <stdio.h>
#include <string.h>
#include <assert.h>
#define HASH_SIZE 1024
char names[100][16] = {{""}};
int hashIndex[HASH_SIZE] = {0};
int GetHashKey(char *num)
{
int key = 0;
int i;
for(i=strlen(num)-1;i>=0;i--)
{
key = key | (1<<((num[i] - '0'))*i);
}
return key%HASH_SIZE;
}
int nameIndex = 0;
void Add(char *num, char *name)
{
hashIndex[GetHashKey(num)] = nameIndex;
strcpy(names[nameIndex],name);
nameIndex++;
}
void HashInit()
{
nameIndex = 0;
memset(hashIndex,0,sizeof(hashIndex));
memset(names,0,sizeof(names));
Add("10020211","YuJinHui");
Add("10004024","GuanKongHui");
Add("10109621","ZhouQimin");
}
char * GetNameByNum(char *num)
{
return names[hashIndex[GetHashKey(num)]];
}
void main(void)
{
HashInit();
assert(strcmp(GetNameByNum("10020211"),"YuJinHui") == 0);
assert(strcmp(GetNameByNum("10004024"),"GuanKongHui") == 0);
assert(strcmp(GetNameByNum("10109621"),"ZhouQimin") == 0);
}