/** * Your LRUCache struct will be instantiated and called as such: * LRUCache* obj = lRUCacheCreate(capacity); * int param_1 = lRUCacheGet(obj, key); * lRUCachePut(obj, key, value); * lRUCacheFree(obj); */
//定义哈希函数求余被除数与哈希表容量的倍数关系 #define scale 2
//定义双链表 typedefstructnode { int value; //节点值 int key; //节点hash值 structnode *last;//指向前向节点 structnode *next;//指向后续节点 bool deleted; //是否删除标记 } Node;
//用二级指针变量cache来保存链表节点从而实现哈希表 typedefstruct { Node **cache; //保存链表节点 Node *head; //头节点 Node *tail; //未节点 int capacity; //哈希表容量 int count; //节点数目 } LRUCache;
//返回参数key对应hash值所在的节点,若cache变量当中无该key所对应的hash值,返回NULL Node* cacheGet(LRUCache *obj, int key) { int m = obj->capacity * scale; for (int a = 0; a < m; a++) { int hash = (key + a) % m; Node *nd = obj->cache[hash]; if (nd != NULL) { if (nd->key == key) { return nd; } } else { returnNULL; } } returnNULL; }
//返回参数key对应的节点的hash,若cache变量当中无该key所对应的节点,返回NULL intcacheIndex(LRUCache *obj, int key) { int m = obj->capacity * scale; for (int a = 0; a < m; a++) { int hash = (key + a) % m; Node *nd = obj->cache[hash]; if (nd != NULL) { if (nd->key == key) { return hash; } } else { return hash; } } return-1; }
voidlRUCacheFree(LRUCache* obj) { int m = obj->capacity * scale; for (int a = 0; a < m; a++) { Node *node = obj->cache[a]; if (node != NULL) { free(node); } } free(obj->cache); free(obj); }