哈希表之我见

/*********
完成于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;
    }
}

运行结果:
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

想想你说过的话

最喜欢你一言不合就打赏的样子了

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值