实现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()方法来将值划分到不同的桶 ...
随机推荐
- JMP CALL RET
一.JMP指令(修改EIP的值)(第一个修改EIP的指令) 三种方法 :JMP 立即数 JMP 寄存器 JMP 内存 EIP 之前介绍过,EIP存放的值就是cpu下一次要执行的地址 1.之前学过要 ...
- Codeforces_448C 分治
昨晚CF碰到的题目,昨晚CF跪了啊啊啊 题意比较简单,给定一排挨在一起的板子,宽度都为1,高度不一,一个刷子宽度也是1,可以横着刷,也可以竖着刷,但是任何时刻刷子都要在板子上,也就是说,如果横向的时候 ...
- MySQL数据库索引常见问题
笔者看过很多数据库相关方面的面试题,但大多数答案都不太准确,因此决定在自己blog进行一个总结. Q1:数据库有哪些索引?优缺点是什么? 1.B树索引:大多数数据库采用的索引(innoDB采用的是b+ ...
- 7206VXR系列板卡简介(转)
原文链接:https://www.it610.com/article/3116409.htm作者:hjw2011 ATM板卡介绍 板卡PA-A6-OC3MM,PA-A6-OC3SMI,PA-A6-OC ...
- Tutorial: Create a Blinky ARM test project(创建一个闪灯的arm测试项目)
Background ref : Tutorial: Create a Blinky ARM test project If you are new to ARM development, it is ...
- android 根据距离区分 点击跟滑动事件
public void onClick(View v) { if (isclick) Log.i(TAG, "onclick"); } }); } float distance = ...
- 18个Java8日期处理的实践,太有用了
专注于Java领域优质技术,欢迎关注 作者:胖先森 Java 8 推出了全新的日期时间API,在教程中我们将通过一些简单的实例来学习如何使用新API. Java处理日期.日历和时间的方式一直为社区所诟 ...
- 最小二乘拟合(scipy实现)
Scipy库在numpy库基础上增加了众多数学,科学及工程计算中常用库函数.如线性代数,常微分方程数值求解,信号处理,图像处理,稀疏矩阵等. 如下理解通过Scipy进行最小二乘法拟合运算 最小二乘拟合 ...
- Apache添加ssl支持
安装证书文件说明:1. 证书文件xxx.pem,包含两段内容,请不要删除任何一段内容.2. 如果是证书系统创建的CSR,还包含:证书私钥文件xxx.key.证书公钥文件public.pem.证书链文件 ...
- uni-app真机调试报错request:fail abort解决方法
Android端真机调试访问本地接口数据时报错:request:fail abort 报错代码 onLoad: function(e) { uni.request({ url: 'http://loc ...