实现一个键的类型为int,值的类型为int的HashMap
输入一个T,表示操作次数;
之后每行接一个操作,可以包括插入、删除、修改、查询、清空、判断是否有这个键;
因为是刚学完随手敲的,所以功能粗糙。插入不考虑键已经存在的情况。删除、修改、查询不考虑键不存在的情况;

#include "bits/stdc++.h"
using namespace std;
typedef long long LL;
const int INF = 0x3f3f3f3f;
// 因为int的数据范围为1 << 32 个数。所以把哈希表开到1 << 16从内存和效率上讲比较折中
const int SIZE = << ;
struct Map {
int key;
int value;
Map* next;
}*hashtable[SIZE];
int hashCode(int k) {
int code = k % SIZE;
return code < ? -code : code;
}
Map* init(int k, int v, Map* next) {
Map* point = (Map*)malloc(sizeof(Map));
point->key = k;
point->value = v;
point->next = next;
return point;
}
void insert(int k, int v) {
int id = hashCode(k);
hashtable[id] = init(k, v, hashtable[id]);
}
void update(int k, int v) {
int id = hashCode(k);
Map* point = hashtable[id];
while (point != NULL) {
if (point->key == k) {
point->value = v;
return;
}
point = point->next;
}
}
int query(int k) {
int id = hashCode(k);
Map* point = hashtable[id];
while (point != NULL) {
if (point->key == k) {
return point->value;
}
point = point->next;
}
}
bool hasKey(int k) {
int id = hashCode(k);
Map* point = hashtable[id];
while (point != NULL) {
if (point->key == k) {
return true;
}
point = point->next;
}
return false;
}
void erase(int k) {
int id = hashCode(k);
Map* pre = hashtable[id];
if (pre == NULL){
return;
}
if (pre->key == k) {
hashtable[id] = NULL;
return;
}
Map* now = pre->next;
while (now != NULL) {
if (now->key == k) {
pre->next = now->next;
free(now);
return;
}
pre = now;
now = now->next;
}
}
void clear() {
for (int i = ; i < SIZE; i++) {
Map* point = hashtable[i];
Map* next;
while (point != NULL) {
next = point->next;
free(point);
point = next;
}
hashtable[i]=NULL;
}
}
int main() {
int T, k, v;
char op[];
scanf("%d", &T);
while (T--) {
scanf("%s", op);
if (strcmp("insert", op) == ) {
scanf("%d%d", &k, &v);
insert(k, v);
} else if (strcmp("update", op) == ) {
scanf("%d%d", &k, &v);
update(k, v);
} else if (strcmp("query", op) == ) {
scanf("%d", &k);
printf("%d\n", query(k));
} else if (strcmp("hasKey", op) == ) {
scanf("%d", &k);
puts(hasKey(k) ? "Yes" : "No");
} else if (strcmp("erase", op) == ) {
scanf("%d", &k);
erase(k);
} else if (strcmp("clear", op) == ) {
clear();
}
}
return ;
}

实现一个简易的HashMap的更多相关文章

  1. 手动实现一个简易版SpringMvc

    版权声明:本篇博客大部分代码引用于公众号:java团长,我只是在作者基础上稍微修改一些内容,内容仅供学习与参考 前言:目前mvc框架经过大浪淘沙,由最初的struts1到struts2,到目前的主流框 ...

  2. .NET Core的文件系统[5]:扩展文件系统构建一个简易版“云盘”

    FileProvider构建了一个抽象文件系统,作为它的两个具体实现,PhysicalFileProvider和EmbeddedFileProvider则分别为我们构建了一个物理文件系统和程序集内嵌文 ...

  3. 自己来实现一个简易的OCR

    来做个简易的字符识别 ,既然是简易的 那么我们就不能用任何的第三方库 .啥谷歌的 tesseract-ocr, opencv 之类的 那些玩意是叼 至少图像处理 机器视觉这类课题对我这种高中没毕业的人 ...

  4. 基于 getter 和 setter 撸一个简易的MVVM

    Angular 和 Vue 在对Angular的学习中,了解到AngularJS 的两个主要缺点: 对于每一次界面时间,Ajax 或者 timeout,都会进行一个脏检查,而每一次脏检查又会在内部循环 ...

  5. 探秘Tomcat——一个简易的Servlet容器

    即便再简陋的服务器也是服务器,今天就来循着书本的第二章来看看如何实现一个servlet容器. 背景知识 既然说到servlet容器这个名词,我们首先要了解它到底是什么. servlet 相比你或多或少 ...

  6. 使用Windows Form 制作一个简易资源管理器

    自制一个简易资源管理器----TreeView控件 第一步.新建project,进行基本设置:(Set as StartUp Project:View/Toolbox/TreeView) 第二步.开始 ...

  7. [后端人员耍前端系列]AngularJs篇:使用AngularJs打造一个简易权限系统

    一.引言 上一篇博文已经向大家介绍了AngularJS核心的一些知识点,在这篇博文将介绍如何把AngularJs应用到实际项目中.本篇博文将使用AngularJS来打造一个简易的权限管理系统.下面不多 ...

  8. ENode 2.0 - 第一个真实案例剖析-一个简易论坛(Forum)

    前言 经过不断的坚持和努力,ENode 2.0的第一个真实案例终于出来了.这个案例是一个简易的论坛,开发这个论坛的初衷是为了验证用ENode框架来开发一个真实项目的可行性.目前这个论坛在UI上是使用了 ...

  9. 使用MVVM框架avalon.js实现一个简易日历

    最近在做公司内部的运营管理系统,因为与日历密切相关,同时无需触发条件直接显示在页面上,所以针对这样的功能场景,我就用avalon快速实现了一个简易日历,毕竟也是第一次造日历这种轮子,所以这里记录下我当 ...

随机推荐

  1. 【MySQL参数】-innodb_flush_method

    innodb_flush_method这个参数控制着innodb数据文件及redo log的打开.刷写模式,对于这个参数,文档上是这样描述的:有三个值:fdatasync(默认),O_DSYNC,O_ ...

  2. WIFI无线协议802.11a/b/g/n/ac的演变以及区别

    摘自:https://blog.csdn.net/Brouce__Lee/article/details/80956945 毫无疑问,WiFi的出现普及带给我们巨大的上网便利,所以了解一下WiFi对应 ...

  3. git submodule update --init 和 --remote的区别

    git 的submodule 工具方便第三方库的管理,比如gitlab 上的各种开源工具,spdlog等 在项目目录下创建.gitmodule 里可以添加第三方库,然后在更新第三方库时,有两个选项 g ...

  4. Maven--设置Http代理

    <settings> ... <proxies> <proxy> <id>my-proxy</id> <active>true& ...

  5. JavaScript详解(一)

    简介: Javascript是一个脚本语言,弱类型的编程语言,简称js,被称为网站开发的行为.它的作用是增加页面特效.前后台交互以及应用于后台开发.它即可写在HTML的script标签里,也可写在外部 ...

  6. Python学习中的随笔,好记性不如烂笔头

    本文 为博主看了 vamei 的blog 写下的随笔 . 致敬Vamei 1.type()   可以显示参数的类型 如 : a=12   type(a) 为 int 2.python的基本类型 为 i ...

  7. JavaScript学习笔记 - 进阶篇(7)- 浏览器对象

    window对象 window对象是BOM的核心,window对象指当前的浏览器窗口. window对象方法: 注意:在JavaScript基础篇中,已讲解了部分属性,window对象重点讲解计时器. ...

  8. 处理Ajax请求跨域问题

    ajax跨域的原理 ajax出现请求跨域错误问题,主要原因就是因为浏览器的“同源策略”. CORS是一个W3C标准,全称是"跨域资源共享"(Cross-origin resourc ...

  9. mysql SQL优化琐记之索引

    equal最好了,其次in,最后是range !=  <>  这类非操作尽量不用,它会转换为range.>都是范围查询 复合索引有左匹配原则,(clo_a,clo_b)相当建立了两个 ...

  10. C3D使用指南

    C3D GitHub项目地址:https://github.com/facebook/C3D C3D 官方用户指南:https://goo.gl/k2SnLY 1. C3D特征提取 1.1 命令参数介 ...