#include <stdio.h>
#define m 11 //定义为素数最好
int fun(int x); //哈希函数设置
void searchHash(int hash[m]); //哈希查找
void initialHash(int hash[m]); //哈希表初始化
void printHash(int hash[m]); //哈希表输出
void insertHash(int hash[m]); //插入
void deleteHash(int hash[m]); //删除
int main()
{
int hash[m];
initialHash(hash);
printHash(hash);
insertHash(hash);
printHash(hash);
deleteHash(hash);
printHash(hash);
searchHash(hash);
return 0;
}
int fun(int x) {
int key;
key=x%m; //关键值为对表长取余
return key;
}
void initialHash(int hash[m]) {
int n,i,x,key;
for (i=0; i<m; i++) { //初始全部赋0值
hash[i]=0;
}
printf("请输入初始化数据个数:");
scanf("%d",&n);
printf("依次录入%d个数据:",n);
for (i=0; i<n; i++) {
scanf("%d",&x);
key=fun(x);
while (hash[key]) { //处理冲突
if (key<m-1) { //线性探测
key++;
} else {
key=0; //循环探测
}
}
hash[key]=x;
}
}
void printHash(int hash[m]) {
int i;
for (i=0; i<m; i++) {
printf("%d\t",hash[i]);
}
printf("\n");
}
void insertHash(int hash[m]) {
int x=1,key;
printf("请输入增加的数(输入0时结束):");
while (x) { //x为0时退出循环
scanf("%d",&x);
key=fun(x);
while (hash[key]) {
if (key<m-1) {
key++;
} else {
key=0;
}
}
hash[key]=x;
}
}
void deleteHash(int hash[m]) {
int x=1,key;
printf("请输入需要删除的数(输入0时结束):");
while (x) {
scanf("%d",&x);
key=fun(x);
while (hash[key]!=x) {
if (key<m-1) {
key++;
} else {
key=0;
}
}
hash[key]=0; //赋值为0即为删除
}
}
void searchHash(int hash[m]) {
int x=1,key;
printf("请输入需要查找的数(输入-1时结束):");
while (x!=-1) {
scanf("%d",&x);
key=fun(x);
while (hash[key]!=x) {
if (key<m-1) {
key++;
if (key==fun(x)) { //循环了一圈找不到
printf("%d->查无此数!\n",x);
key=-1;
break;
}
} else {
key=0;
}
}
if (key!=-1) {
printf("%d->%d\t",x,key+1); //输出位置时下标+1
}
}
printf("\n");
}