1. /*
    *数组下面挂着链表
    */
  2.  
  3. #include<stdio.h>
  4. #include<unistd.h>
  5. #include<stdlib.h>
  6. #include<malloc.h>
  7. #include<string.h>
  8. #include<memory.h>
  9.  
  10. #define uint32 unsigned int
  11. #define size_t unsigned int
  12. #define uchar unsigned char
  13.  
  14. uint32 bucknum=;
  15.  
  16. typedef struct data{
  17. uint32 key;
  18. char msg[];
  19. struct data* next;
  20. }DATA;
  21.  
  22. typedef struct{
  23. uint32 len;
  24. DATA* data;
  25. }BUCKET;
  26.  
  27. BUCKET* buckets=NULL;
  28.  
  29. void initMap(uint32* num,BUCKET* dst){
  30. dst=(BUCKET*)malloc(sizeof(BUCKET)*(*num));
  31. memset(dst,,sizeof(BUCKET)*(*num));
  32. }
  33.  
  34. uint32 hashKey(uchar* p ,size_t len){
  35. uint32 key=;
  36. for(int i=;i<len;i++){
  37. key=key*+*(p+i);
  38. }
  39. return key;
  40. }
  41.  
  42. int mapSize(BUCKET* bucket,size_t len){
  43. int sum=;
  44. for(int i=;i<len;i++){
  45. sum+=bucket[i].len;
  46. }
  47. return sum;
  48. }
  49.  
  50. void put(BUCKET* bucket,size_t size,uint32 key,DATA* data){
  51. int index=key%size;
  52. data->key=key;
  53. if(bucket[index].len==){
  54. bucket[index].data=data;
  55. bucket[index].len++;
  56. return;
  57. }else{
  58. DATA* top = bucket[index].data;
  59. DATA* below = bucket[index].data;
  60. int count=;
  61. do{
  62. if(below->key==key){
  63. if(count==){
  64. bucket[index].data=data;
  65. data->next=below->next;
  66. free(below);
  67. below=data;
  68. }else{
  69. top->next=data;
  70. data->next=below->next;
  71. free(below);
  72. below=data;
  73. free(below);
  74. }
  75. break;
  76. }else{
  77. if(below->next!=NULL){
  78. top=below;
  79. below=below->next;
  80. }else{
  81. below->next=data;
  82. bucket[index].len++;
  83. break;
  84. }
  85. }
  86. count++;
  87. }while();
  88. }
  89. }
  90.  
  91. void destroy(BUCKET* buck,size_t len){
  92. for(int i=;i<len;i++){
  93. DATA* bc=buck[i].data;
  94. while (bc!=NULL) {
  95. DATA* tem=bc;
  96. bc=bc->next;
  97. free(tem);
  98. }
  99. }
  100. free(buck);
  101. }
  102.  
  103. void entryExtend(BUCKET* oldbucket,size_t* newlen,size_t oldlen){
  104. BUCKET* newbucket=NULL;
  105. *newlen=(*newlen)<<;
  106. initMap(*newlen,newbucket);
  107.  
  108. for(int i=;i<oldlen;i++){
  109. DATA* bc=oldbucket[i].data;
  110. while (bc!=NULL) {
  111. put(newbucket,*newlen,bc->key,bc);
  112. bc=bc->next;
  113. }
  114. }
  115.  
  116. destroy(oldbucket,oldlen);
  117. oldbucket=newbucket;
  118. }
  119.  
  120. /*
  121. void put(BUCKET* bucket,char* key,size_t len,DATA* data){
  122. uint32 k = hashKey(key,len);
  123. uint32 index = k % buck_num;
  124. data->key=k;
  125. if(bucket[index].len==0){
  126. bucket[index].data=data;
  127. bucket[index].len++;
  128. return;
  129. }else{
  130. DATA* top = bucket[index].data;
  131. DATA* below = bucket[index].data;
  132. int count=0;
  133. do{
  134. if(below->key==k){
  135. if(count==0){
  136. bucket[index].data=data;
  137. data->next=below->next;
  138. free(below);
  139. below=data;
  140. }else{
  141. top->next=data;
  142. data->next=below->next;
  143. free(below);
  144. below=data;
  145. free(below);
  146. }
  147. break;
  148. }else{
  149. if(below->next!=NULL){
  150. top=below;
  151. below=below->next;
  152. }else{
  153. below->next=data;
  154. bucket[index].len++;
  155. break;
  156. }
  157. }
  158. count++;
  159. }while(1);
  160. }
  161. }
  162. */
  163.  
  164. int main(){
  165. initMap(&bucknum,buckets);
  166.  
  167. destroy(buckets,bucknum);
  168. }

实现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. The hierarchy of the type is inconsistent

    原因:我看到有一个interface的java类里面import了一个没有用到的类,手贱,把这个接口里面引用了但是没有没有用到的类删掉了, 结果这个接口的子类用到了,统统报标题上的错误.只要把删掉的改 ...

  2. java课程课后作业190530之找水王

    从题目中我们可以看出,水王有着相当严苛的条件才可以成为,那就是必须拥有一半的评论量才可以当上水王.当然这就是破题的关键,最简单的算法当然是用O(N平方)的复杂度的那种算法,但显然,我们需要的不是这种. ...

  3. 春节宅家火了短视频,手游 APP 成最大赢家!

    春节历来是APP运营者翘首以盼的火热期,但2020年的春节有些特殊, 新型冠状病毒的爆发,牵动着全国亿万人民的心.响应号召不出门,宅在家里玩手机,于是打游戏.看新闻.追剧等成为大家打发时间.疏解内心压 ...

  4. 201909-2 小明种苹果(续) Java

    思路: 待补充 import java.util.*; public class Main { public static void main(String[] args) { Scanner sc ...

  5. Android进阶——多线程系列之四大线程池的使用介绍

    线程池一直是初学者最抵触的东西,由于刚开始学习做项目并不会涉及到线程池的使用,但是不去学习它,心里又好像有个石头一直沉着,一直放心不下,其实是很简单的东西,早晚都要学,不如趁现在吧.由于文章从初学者的 ...

  6. 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 ...

  7. 判断苹果和安卓端或者wp端

    window.onload = function() { var u = navigator.userAgent; if(u.indexOf('Android') > -1 || u.index ...

  8. Linq------连表查询

    1 List<Student> list = new List<Student>() { ,sex="男"}, ,sex="男"}, , ...

  9. pycharm2018专业版

    https://blog.csdn.net/moshanghuali/article/details/94396935 1 下载Pycharm专业版2018.3.1许多人直接在官网直接下载,默认的都是 ...

  10. Android :TextView使用SpannableString设置复合文本

    TextView通常用来显示普通文本,但是有时候需要对其中某些文本进行样式.事件方面的设置.Android系统通过SpannableString类来对指定文本进行相关处理,具体有以下功能: 1.Bac ...