实现一个简易的HashMap
实现一个键的类型为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的更多相关文章
- 手动实现一个简易版SpringMvc
版权声明:本篇博客大部分代码引用于公众号:java团长,我只是在作者基础上稍微修改一些内容,内容仅供学习与参考 前言:目前mvc框架经过大浪淘沙,由最初的struts1到struts2,到目前的主流框 ...
- .NET Core的文件系统[5]:扩展文件系统构建一个简易版“云盘”
FileProvider构建了一个抽象文件系统,作为它的两个具体实现,PhysicalFileProvider和EmbeddedFileProvider则分别为我们构建了一个物理文件系统和程序集内嵌文 ...
- 自己来实现一个简易的OCR
来做个简易的字符识别 ,既然是简易的 那么我们就不能用任何的第三方库 .啥谷歌的 tesseract-ocr, opencv 之类的 那些玩意是叼 至少图像处理 机器视觉这类课题对我这种高中没毕业的人 ...
- 基于 getter 和 setter 撸一个简易的MVVM
Angular 和 Vue 在对Angular的学习中,了解到AngularJS 的两个主要缺点: 对于每一次界面时间,Ajax 或者 timeout,都会进行一个脏检查,而每一次脏检查又会在内部循环 ...
- 探秘Tomcat——一个简易的Servlet容器
即便再简陋的服务器也是服务器,今天就来循着书本的第二章来看看如何实现一个servlet容器. 背景知识 既然说到servlet容器这个名词,我们首先要了解它到底是什么. servlet 相比你或多或少 ...
- 使用Windows Form 制作一个简易资源管理器
自制一个简易资源管理器----TreeView控件 第一步.新建project,进行基本设置:(Set as StartUp Project:View/Toolbox/TreeView) 第二步.开始 ...
- [后端人员耍前端系列]AngularJs篇:使用AngularJs打造一个简易权限系统
一.引言 上一篇博文已经向大家介绍了AngularJS核心的一些知识点,在这篇博文将介绍如何把AngularJs应用到实际项目中.本篇博文将使用AngularJS来打造一个简易的权限管理系统.下面不多 ...
- ENode 2.0 - 第一个真实案例剖析-一个简易论坛(Forum)
前言 经过不断的坚持和努力,ENode 2.0的第一个真实案例终于出来了.这个案例是一个简易的论坛,开发这个论坛的初衷是为了验证用ENode框架来开发一个真实项目的可行性.目前这个论坛在UI上是使用了 ...
- 使用MVVM框架avalon.js实现一个简易日历
最近在做公司内部的运营管理系统,因为与日历密切相关,同时无需触发条件直接显示在页面上,所以针对这样的功能场景,我就用avalon快速实现了一个简易日历,毕竟也是第一次造日历这种轮子,所以这里记录下我当 ...
随机推荐
- 01 语言基础+高级:1-10 JDK8新特性_day12【函数式接口】
day12[函数式接口] 主要内容自定义函数式接口函数式编程常用函数式接口 教学目标能够使用@FunctionalInterface注解能够自定义无参无返回函数式接口能够自定义有参有返回函数式接口能够 ...
- 01 语言基础+高级:1-2 面向对象和封装_day06【类与对象、封装、构造方法】
day06[类与对象.封装.构造方法] 面向对象类与对象三大特征——封装构造方法 能够理解面向对象的思想能够明确类与对象关系能够掌握类的定义格式能够掌握创建对象格式,并访问类中的成员能够完成手机类的练 ...
- MyBatis从入门到精通(第2章):MyBatis XML方式的基本用法【insert用法、update用法、delete用法】
2.4 insert 用法 2.4.1 简单的 insert方法 在接口 UserMapper.java 中添加如下方法. /** * 新增用户 * @param sysUser * @retur ...
- 查看jks文件中的签名
1. 打开CMD命令行进入本机安装的jdk或jre下的bin目录. 2. 下来看图 keytool -list -v -keystore C:\Users\Administrator\Desktop\ ...
- c语言中用简单方法对多维数组进行初始化
例:int array[4][3] = {1,2,3,4,5,6,7,8,9,10,11,12}; 说明:a.由4*3可知,本二维数组包含12个元素,因此初始化时array[0][0] = 1 ,ar ...
- numpy(二)
1.集合操作 包含去重,交,并,差集操作 2.排序.搜索和计数 sort,where,argmin,argmax,count_nonzero,argwhere 3.线性代数 np.linalg库,包含 ...
- pytHon深度学习(3.4)
keras绘制损失函数曲线 # -*- coding: utf-8 -*-'''Trains a simple deep NN on the MNIST dataset.Gets to 98.40% ...
- Matlab高级教程_第一篇:Matlab基础知识提炼_04
第八节:几大MATLAB的数据类型 8.1 数值型 8.2 字符和字符串 创建用' ' 8.3 函数句柄 8.4 结构体 创建用. 语法:struct('field', var1,'field2',' ...
- JavaScript之OOP
本文介绍下js中OOP的一些用法: 由上图可得: 1.typeof null结果是object,所以需要用与运算符再次判断是否为空. 2.构造器实现重载后,可依序传入参数或传入对象. 由上图可得:要实 ...
- jquery选择器之获取父级元素、同级元素、子元素
一.获取父级元素 1. parent([expr]): 获取指定元素的所有父级元素 二.获取同级元素: 1.next([expr]): 获取指定元素的下一个同级元素 2.nextAll([expr]) ...