/*
*数组下面挂着链表
*/ #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的更多相关文章

  1. HashMap与TreeMap源码分析

    1. 引言     在红黑树--算法导论(15)中学习了红黑树的原理.本来打算自己来试着实现一下,然而在看了JDK(1.8.0)TreeMap的源码后恍然发现原来它就是利用红黑树实现的(很惭愧学了Ja ...

  2. HashMap的工作原理

    HashMap的工作原理   HashMap的工作原理是近年来常见的Java面试题.几乎每个Java程序员都知道HashMap,都知道哪里要用HashMap,知道HashTable和HashMap之间 ...

  3. 计算机程序的思维逻辑 (40) - 剖析HashMap

    前面两节介绍了ArrayList和LinkedList,它们的一个共同特点是,查找元素的效率都比较低,都需要逐个进行比较,本节介绍HashMap,它的查找效率则要高的多,HashMap是什么?怎么用? ...

  4. Java集合专题总结(1):HashMap 和 HashTable 源码学习和面试总结

    2017年的秋招彻底结束了,感觉Java上面的最常见的集合相关的问题就是hash--系列和一些常用并发集合和队列,堆等结合算法一起考察,不完全统计,本人经历:先后百度.唯品会.58同城.新浪微博.趣分 ...

  5. 学习Redis你必须了解的数据结构——HashMap实现

    本文版权归博客园和作者吴双本人共同所有,转载和爬虫请注明原文链接博客园蜗牛 cnblogs.com\tdws . 首先提供一种获取hashCode的方法,是一种比较受欢迎的方式,该方法参照了一位园友的 ...

  6. HashMap与HashTable的区别

    HashMap和HashSet的区别是Java面试中最常被问到的问题.如果没有涉及到Collection框架以及多线程的面试,可以说是不完整.而Collection框架的问题不涉及到HashSet和H ...

  7. JDK1.8 HashMap 源码分析

    一.概述 以键值对的形式存储,是基于Map接口的实现,可以接收null的键值,不保证有序(比如插入顺序),存储着Entry(hash, key, value, next)对象. 二.示例 public ...

  8. HashMap 源码解析

    HashMap简介: HashMap在日常的开发中应用的非常之广泛,它是基于Hash表,实现了Map接口,以键值对(key-value)形式进行数据存储,HashMap在数据结构上使用的是数组+链表. ...

  9. java面试题——HashMap和Hashtable 的区别

    一.HashMap 和Hashtable 的区别 我们先看2个类的定义 public class Hashtable extends Dictionary implements Map, Clonea ...

  10. 再谈HashMap

    HashMap是一个高效通用的数据结构,它在每一个Java程序中都随处可见.先来介绍些基础知识.你可能也知 道,HashMap使用key的hashCode()和equals()方法来将值划分到不同的桶 ...

随机推荐

  1. .chm无法打开问题(windows)

    .chm无法打开问题,尤其是重做系统之后 C:\Windows 确保有hh.exehhctrl.ocxC:\Windows\SysWOW64 确保有itss.dll 否则百度下载hh.exehhctr ...

  2. soap调用Jar包冲突,SOAPMessageContext

    ================================ ©Copyright 蕃薯耀 2020-01-07 https://www.cnblogs.com/fanshuyao/ soap调用 ...

  3. 实现VR直播的关键技术

    VR是多媒体技术发展的必然趋势,人们所使用的信息载体从最早的文字.图像,到音视频,再到用VR,将事物的描述表达推向了极致,充分满足了沉浸性.互动性和构想性三大要素的需求.随着5G的商业化运营,VR有望 ...

  4. 3,Structured Streaming使用checkpoint进行故障恢复

    使用checkpoint进行故障恢复 如果发生故障或关机,可以恢复之前的查询的进度和状态,并从停止的地方继续执行.这是使用Checkpoint和预写日志完成的.您可以使用检查点位置配置查询,那么查询将 ...

  5. MySQL的异常问题

    异常问题

  6. SpringBoot+Shiro+DB (二)

    之前我们完成了Spring+Shiro的最基本配置搭建,现在我们再增加上DB,毕竟没有哪个系统会将用户.角色.权限等信息硬编码到代码里.DB选用myslq. 数据库准备 脚本如下.依然是两个用户:ad ...

  7. 为什么ApplePay在中国一直火不起来?

    今年7月,易观发布<中国第三方移动支付市场2018年第1季度监测报告>.报告显示,2018年第一季度支付宝以53.76%的市场份额占据移动支付头把交椅,腾讯金融(微信支付)则以38.95% ...

  8. 题解 P1654 【OSU!】

    题面 一序列\(a\), 对于每一个\(i\)均有\(a_i\)有\(p_i\)的几率为1, 否则为\(0\) 求: \(a\)中极长全\(1\)子序列长度三次方之和的期望 前置知识 基本期望(期望的 ...

  9. rewrite例子集合

    在 httpd 中将一个域名转发到另一个域名 虚拟主机世界近期更换了域名,新域名为 www.wbhw.com, 更加简短好记.这时需要将原来的域名 webhosting-world.com, 以及论坛 ...

  10. Django1.11序列化与反序列化

    django序列化与反序列化 from rest_framwork import serializers serializers.ModelSerializer 模型类序列化器,必须依据模型类创建序列 ...