小白学C语言数据结构之哈希表

哈希表

哈希表的特点是:哈希表的增删改查,在使用时,时间复杂度为O(1)

java和c++有已经封装好的HashMap了

而如果想自己写实现一个hashmap的话可能得写一百多行代码了...

C语言需要调用第三方库 uthash.h

#include<stdio.h>
#include<stdlib.h>
#include"uthash.h"

struct person{
    int id;           // 这是key值
    char name[20];    // 值1
    int age;         // 值2
    UT_hash_handle hh;  // uthash自带的指针
};
void add(int id, char* name, int age){
    struct person* new_person = malloc(sizeof(struct person));
    new_person->id = id;
    // 这个strcpy相当于字符串的赋值操作
    strcpy(new_person->name, name);
    new_person->age = age;
    //这里三个函数 people——头指针 id->key值  new_person 要添加去的指针
    HASH_ADD_INT(people, id, new_person);
}
// 但是hashmap有一个特点:如果key值,比如一号柜已经有东西了, 再添加东西hashmap会直接把原本柜子里的东西丢出去(恶霸
// 而HASH_ADD_INT不能实现这个功能
void ebaadd(int id, char* name, int age){
    struct person* new_person = malloc(sizeof(struct person));
    HASH_FIND_INT(person, &id, new_person);
    if(new_person->name != NULL || new_person->age !=NULL){
        HASH_DELETE(new_person->id);
     }
    new_person->id = id;
    strcpy(new_person->name, name);
    new_person->age = age;
    HASH_ADD_INT(people, id, new_person);
}
    
        

struct person* find_person(int id){
    struct person* person_found;
    HASH_FIND_INT(people, &id, person_found);
    return person_found;
}

void print_people(){
    struct person* cur_person;
    // 遍历
    for(cur_person = people; cur_person!=NULL; cur_person->hh.next){
        printf("%d  %s  %d\n", cur_person->id, cur_person->name, cur_person->age);
    }
}
void delete_person(int id){
    struct person* person_del = find_person(id);
    if(person_del != NULL){
        HASH_DEL(person, person_del);
        free(person_del);
    }
    else{
        printf("person with id not found");
    }
}

先会用再说...

哈希函数那段我真的没太听懂...

但是哈希表有颇多应用

哈希函数

一个函数经典的结构应该是这样,比如入栈操作

void(返回类型) push(函数名) ( struct Stack* stack, int value)

或是什么

int add(int a, int b)

总的来说 就是

out f(in)格式

哈希函数的性质

1.输入域被认为是无穷的 输出域是有限的

2.不是随机的,相同的输入,一定产生相同的输出

3.因为输入无穷输出有限,不同的输入,可能产生相同输出(哈希碰撞)

4. 均匀、离散,相同的大小在整个域里包含相同个数数据

应用

样本组A ——hash函数——> out组S ——%m———>m组

样本组A里是无规律的。但是经过哈希函数,out组S是均匀分布。

在%m后,就在0~m-1上面均匀分布。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值