一.构建哈希函数的方法
- 直接地址法
- 除留余数法
- 平方取中法
- 折叠法
- 数值分析法
二.利用除留余数方法查找图书
#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 5
#define NULLKEY -32768
typedef struct{
char name[20];
int number;
}book;
typedef struct{
book *elem;
int count;
}HashTable;
int InitHashTable(HashTable &H)
{
int i;
H.elem = (book*)malloc(MAXSIZE*sizeof(book));
if(!H.elem)exit(-2);
H.count = MAXSIZE;
for(i=0;i<MAXSIZE;i++)
{
H.elem[i].number=NULLKEY;
}
return 1;
}
int Hash(int key)
{
return key%MAXSIZE;
}
void InsertHash(HashTable &H,book &key)
{
int addr = Hash(key.number);
while(H.elem[addr].number!=NULLKEY)
addr = (addr+1)%MAXSIZE ;
H.elem[addr] = key;
}
int SearchHash(HashTable H,int key)
{
int addr;
addr=Hash(key);
while(H.elem[addr].number!=key)
{
addr = (addr+1)%MAXSIZE;
if(H.elem[addr].number==NULLKEY||addr==Hash(key))
{
return -1;
}
}
return addr;
}
int main()
{
int i ,number,j;
book s[MAXSIZE]={{"English",5},{"math",6},{"C",9},{"python",8},{"Chinese",7}};
printf("书名 编号\n");
for(i=0;i<MAXSIZE;i++)
printf("%-7s %7d\n",s[i].name,s[i].number);
HashTable H;
InitHashTable(H);
for(i=0;i<MAXSIZE;i++)
{
InsertHash(H,s[i]);
}
printf("\n\n插入之后的哈希表为:\n\n");
printf("书名 地址\n");
for(i=0;i<MAXSIZE;i++)
printf("%-7s %7d\n",H.elem[i].name,i);
printf("\n\n请输入要查找图书的编号:");
scanf("%d",&number);
j=SearchHash(H,number);
printf("你查找的图书为:");
printf("“%s”\n",H.elem[j].name);
return 0;
}