实现hashmap
- /*
*数组下面挂着链表
*/- #include<stdio.h>
- #include<unistd.h>
- #include<stdlib.h>
- #include<malloc.h>
- #include<string.h>
- #include<memory.h>
- #define uint32 unsigned int
- #define size_t unsigned int
- #define uchar unsigned char
- uint32 bucknum=;
- typedef struct data{
- uint32 key;
- char msg[];
- struct data* next;
- }DATA;
- typedef struct{
- uint32 len;
- DATA* data;
- }BUCKET;
- BUCKET* buckets=NULL;
- void initMap(uint32* num,BUCKET* dst){
- dst=(BUCKET*)malloc(sizeof(BUCKET)*(*num));
- memset(dst,,sizeof(BUCKET)*(*num));
- }
- uint32 hashKey(uchar* p ,size_t len){
- uint32 key=;
- for(int i=;i<len;i++){
- key=key*+*(p+i);
- }
- return key;
- }
- int mapSize(BUCKET* bucket,size_t len){
- int sum=;
- for(int i=;i<len;i++){
- sum+=bucket[i].len;
- }
- return sum;
- }
- void put(BUCKET* bucket,size_t size,uint32 key,DATA* data){
- int index=key%size;
- data->key=key;
- if(bucket[index].len==){
- bucket[index].data=data;
- bucket[index].len++;
- return;
- }else{
- DATA* top = bucket[index].data;
- DATA* below = bucket[index].data;
- int count=;
- do{
- if(below->key==key){
- if(count==){
- bucket[index].data=data;
- data->next=below->next;
- free(below);
- below=data;
- }else{
- top->next=data;
- data->next=below->next;
- free(below);
- below=data;
- free(below);
- }
- break;
- }else{
- if(below->next!=NULL){
- top=below;
- below=below->next;
- }else{
- below->next=data;
- bucket[index].len++;
- break;
- }
- }
- count++;
- }while();
- }
- }
- void destroy(BUCKET* buck,size_t len){
- for(int i=;i<len;i++){
- DATA* bc=buck[i].data;
- while (bc!=NULL) {
- DATA* tem=bc;
- bc=bc->next;
- free(tem);
- }
- }
- free(buck);
- }
- void entryExtend(BUCKET* oldbucket,size_t* newlen,size_t oldlen){
- BUCKET* newbucket=NULL;
- *newlen=(*newlen)<<;
- initMap(*newlen,newbucket);
- for(int i=;i<oldlen;i++){
- DATA* bc=oldbucket[i].data;
- while (bc!=NULL) {
- put(newbucket,*newlen,bc->key,bc);
- bc=bc->next;
- }
- }
- destroy(oldbucket,oldlen);
- oldbucket=newbucket;
- }
- /*
- void put(BUCKET* bucket,char* key,size_t len,DATA* data){
- uint32 k = hashKey(key,len);
- uint32 index = k % buck_num;
- data->key=k;
- if(bucket[index].len==0){
- bucket[index].data=data;
- bucket[index].len++;
- return;
- }else{
- DATA* top = bucket[index].data;
- DATA* below = bucket[index].data;
- int count=0;
- do{
- if(below->key==k){
- if(count==0){
- bucket[index].data=data;
- data->next=below->next;
- free(below);
- below=data;
- }else{
- top->next=data;
- data->next=below->next;
- free(below);
- below=data;
- free(below);
- }
- break;
- }else{
- if(below->next!=NULL){
- top=below;
- below=below->next;
- }else{
- below->next=data;
- bucket[index].len++;
- break;
- }
- }
- count++;
- }while(1);
- }
- }
- */
- int main(){
- initMap(&bucknum,buckets);
- destroy(buckets,bucknum);
- }
实现hashmap的更多相关文章
- HashMap与TreeMap源码分析
1. 引言 在红黑树--算法导论(15)中学习了红黑树的原理.本来打算自己来试着实现一下,然而在看了JDK(1.8.0)TreeMap的源码后恍然发现原来它就是利用红黑树实现的(很惭愧学了Ja ...
- HashMap的工作原理
HashMap的工作原理 HashMap的工作原理是近年来常见的Java面试题.几乎每个Java程序员都知道HashMap,都知道哪里要用HashMap,知道HashTable和HashMap之间 ...
- 计算机程序的思维逻辑 (40) - 剖析HashMap
前面两节介绍了ArrayList和LinkedList,它们的一个共同特点是,查找元素的效率都比较低,都需要逐个进行比较,本节介绍HashMap,它的查找效率则要高的多,HashMap是什么?怎么用? ...
- Java集合专题总结(1):HashMap 和 HashTable 源码学习和面试总结
2017年的秋招彻底结束了,感觉Java上面的最常见的集合相关的问题就是hash--系列和一些常用并发集合和队列,堆等结合算法一起考察,不完全统计,本人经历:先后百度.唯品会.58同城.新浪微博.趣分 ...
- 学习Redis你必须了解的数据结构——HashMap实现
本文版权归博客园和作者吴双本人共同所有,转载和爬虫请注明原文链接博客园蜗牛 cnblogs.com\tdws . 首先提供一种获取hashCode的方法,是一种比较受欢迎的方式,该方法参照了一位园友的 ...
- HashMap与HashTable的区别
HashMap和HashSet的区别是Java面试中最常被问到的问题.如果没有涉及到Collection框架以及多线程的面试,可以说是不完整.而Collection框架的问题不涉及到HashSet和H ...
- JDK1.8 HashMap 源码分析
一.概述 以键值对的形式存储,是基于Map接口的实现,可以接收null的键值,不保证有序(比如插入顺序),存储着Entry(hash, key, value, next)对象. 二.示例 public ...
- HashMap 源码解析
HashMap简介: HashMap在日常的开发中应用的非常之广泛,它是基于Hash表,实现了Map接口,以键值对(key-value)形式进行数据存储,HashMap在数据结构上使用的是数组+链表. ...
- java面试题——HashMap和Hashtable 的区别
一.HashMap 和Hashtable 的区别 我们先看2个类的定义 public class Hashtable extends Dictionary implements Map, Clonea ...
- 再谈HashMap
HashMap是一个高效通用的数据结构,它在每一个Java程序中都随处可见.先来介绍些基础知识.你可能也知 道,HashMap使用key的hashCode()和equals()方法来将值划分到不同的桶 ...
随机推荐
- The hierarchy of the type is inconsistent
原因:我看到有一个interface的java类里面import了一个没有用到的类,手贱,把这个接口里面引用了但是没有没有用到的类删掉了, 结果这个接口的子类用到了,统统报标题上的错误.只要把删掉的改 ...
- java课程课后作业190530之找水王
从题目中我们可以看出,水王有着相当严苛的条件才可以成为,那就是必须拥有一半的评论量才可以当上水王.当然这就是破题的关键,最简单的算法当然是用O(N平方)的复杂度的那种算法,但显然,我们需要的不是这种. ...
- 春节宅家火了短视频,手游 APP 成最大赢家!
春节历来是APP运营者翘首以盼的火热期,但2020年的春节有些特殊, 新型冠状病毒的爆发,牵动着全国亿万人民的心.响应号召不出门,宅在家里玩手机,于是打游戏.看新闻.追剧等成为大家打发时间.疏解内心压 ...
- 201909-2 小明种苹果(续) Java
思路: 待补充 import java.util.*; public class Main { public static void main(String[] args) { Scanner sc ...
- Android进阶——多线程系列之四大线程池的使用介绍
线程池一直是初学者最抵触的东西,由于刚开始学习做项目并不会涉及到线程池的使用,但是不去学习它,心里又好像有个石头一直沉着,一直放心不下,其实是很简单的东西,早晚都要学,不如趁现在吧.由于文章从初学者的 ...
- 2,The AudioContext was not allowed to start.
The AudioContext was not allowed to start. It must be resumed (or created) after a user gesture on t ...
- 判断苹果和安卓端或者wp端
window.onload = function() { var u = navigator.userAgent; if(u.indexOf('Android') > -1 || u.index ...
- Linq------连表查询
1 List<Student> list = new List<Student>() { ,sex="男"}, ,sex="男"}, , ...
- pycharm2018专业版
https://blog.csdn.net/moshanghuali/article/details/94396935 1 下载Pycharm专业版2018.3.1许多人直接在官网直接下载,默认的都是 ...
- Android :TextView使用SpannableString设置复合文本
TextView通常用来显示普通文本,但是有时候需要对其中某些文本进行样式.事件方面的设置.Android系统通过SpannableString类来对指定文本进行相关处理,具体有以下功能: 1.Bac ...