/*********
完成于11:15 2018/3/20
Made by WenZhang
*************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct Student{
char name[20]; //key
int phone; //value
struct Student *next; //为了解决冲突引入结点。
};
#define InsertDataSize 5 //插入哈希表中数据的多少
#define HashTableSize 7 //哈希表大小(比上面的值大一点),由你想添加多少个元素决定,为素数最好
//定义哈希表元素类型
typedef struct Student * HashTable; //哈希表是直接存元素,还是存元素地址,取决于你,(如果元素很大,不建议直接存元素,这里存的是元素地址)
unsigned int hash(const char *name){ //哈希函数,自定义的(除数取余法改写),其实还有很多很好的写法
int location=0;
while(*name!='\0'){
location += abs(name[0]); //将字符串中各个字符对应的ascii码值相加
name++;
}
location = location%HashTableSize; //最后取除以哈希表大小后的余数,作为传进来的name(键)对应的哈希表位置
return location;
}
void insertElem(HashTable *hashTable,struct Student *stu){
int location = hash(stu->name);
printf("location = %d\n",location);
//(冲突怎么办?!先判断)
if(hashTable[location]==NULL){
hashTable[location] = stu;
}else{ //若冲突,前面元素中定义的next结点就起作用了(实际上解决冲突不是只有这种方法)
struct Student *temp = hashTable[location];
printf("冲突\n");
while(temp->next!=NULL){
temp = temp->next;
}
temp->next = stu;
}
}
int main(){
int i;
//得到一个空的哈希表
HashTable hashTable[HashTableSize];
for(i=0;i<HashTableSize;i++){
hashTable[i] = NULL;
}
//接下来开始向哈希表中添加数据
struct Student *newStu;
for(i=0;i<InsertDataSize;i++){
newStu = (struct Student *)malloc(sizeof(struct Student));
printf("第%d次添加,请输入姓名:\n",i+1);
scanf("%s",&newStu->name);
printf("请输入该学生手机:\n");
scanf("%d",&newStu->phone);
newStu->next = NULL;
//得到一个新的元素信息后,加入哈希表中
insertElem(hashTable,newStu);
printf("\n");
}
printf("\n");
//接下来就是查询了
char name[20];
printf("请输入查询人姓名:\n");
scanf("%s",&name);
struct Student *temp = hashTable[hash(name)];
while(strcmp(name,temp->name)!=0&&temp!=NULL){
temp = temp->next;
}
if(temp!=NULL){
printf("%s的手机号为:%d\n",temp->name,temp->phone);
return 1;
}else{
printf("木有该人\n");
return 0;
}
}
运行结果: