zoukankan      html  css  js  c++  java
  • 实现一个简易的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 = 1 << 16;
    struct Map {
        int key;
        int value;
        Map* next;
    }*hashtable[SIZE];
    int hashCode(int k) {
        int code = k % SIZE;
        return code < 0 ? -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 = 0; 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[10];
        scanf("%d", &T);
        while (T--) {
            scanf("%s", op);
            if (strcmp("insert", op) == 0) {
                scanf("%d%d", &k, &v);
                insert(k, v);
            } else if (strcmp("update", op) == 0) {
                scanf("%d%d", &k, &v);
                update(k, v);
            } else if (strcmp("query", op) == 0) {
                scanf("%d", &k);
                printf("%d
    ", query(k));
            } else if (strcmp("hasKey", op) == 0) {
                scanf("%d", &k);
                puts(hasKey(k) ? "Yes" : "No");
            } else if (strcmp("erase", op) == 0) {
                scanf("%d", &k);
                erase(k);
            } else if (strcmp("clear", op) == 0) {
                clear();
            }
        }
        return 0;
    }
  • 相关阅读:
    (原创,呕心历血之作,强烈推荐)新旧库数据字典比较脚本
    MS SQL Server2k字符串分拆与合并处理代码
    20061021个人日志(关于在VS2005环境下无法从源视图切换到设计视图的解决方案)
    我设计的花销流水帐的数据库结构 荣
    Oracle中创建表,创建序列,创建自增字段,添加注释, 添加记录,添加触发器,提交 荣
    用例与用例描述 荣
    计算经纬度距离 荣
    我的第一个C++程序 荣
    以较少代码实现DataGrid的排序,翻页,删除等功能(续) 荣
    我的BREW代码 荣
  • 原文地址:https://www.cnblogs.com/Angel-Demon/p/10204721.html
Copyright © 2011-2022 走看看