LRU缓存结构【C语言】

c 复制代码
#include <stdio.h>
#include <stdlib.h>

//双链表节点结构
typedef struct Node {
	int key;
	int value;
	struct Node* pre;
	struct Node* next;
} Node;

//LRU结构
typedef struct 
{
	int capacity;
	struct Node* head;
	struct Node* tail;
	struct Node** cache;
}LRUCache;

//创建新节点
Node* createNode(int key, int value)
{
	Node* newNode = (Node*)malloc(sizeof(Node));
	newNode->key = key;
	newNode->value = value;
	newNode->pre = NULL;
	newNode->next = NULL;
	return newNode;
}

//创建LRU缓存
LRUCache* creatLRUCache(int capacity)
{
	LRUCache* cache = (LRUCache*)malloc(sizeof(LRUCache));
	cache->capacity = capacity;
	cache->head = createNode(0, 0);
	cache->tail = createNode(0, 0);
	cache->head->next = cache->tail;
	cache->tail->pre = cache->head;

	cache->cache = (Node**)malloc(sizeof(Node*)*100001);
	for (int i = 0; i < 100001; i++)
	{
		cache->cache[i] = NULL;
	}
	return cache;
}

//删除节点
void deleteNode(Node* node)
{
	node->pre->next = node->next;
	node->next->pre = node->pre;
}

//插入节点到头部
void insertToHead(Node* node, Node* head)
{
	node->next = head->next;
	node->pre = head;
	head->next = node;
	node->next->pre = node;
}

int getLRUCacheValue(LRUCache* obj, int key)
{
	if (obj->cache[key] != NULL)
	{
		Node* node = obj->cache[key];
		deleteNode(node);
		insertToHead(node, obj->head);
		return node->value;
	}
	return -1;
}

void setLRUCacheValue(LRUCache* obj, int key, int value)
{
	if (obj->cache[key] != NULL)
	{
		Node* node = obj->cache[key];
		node->value = value;
		deleteNode(node);
		insertToHead(node, obj->head);
	}
	else
	{
		Node* newNode = createNode(key, value);
		obj->cache[key] = newNode;
		insertToHead(newNode, obj->head);
		if(obj->capacity-- == 0)
		{
			Node* tail = obj->tail->pre;
			deleteNode(tail);
			obj->cache[tail->key] = NULL;
			free(tail);
			obj->capacity++;
		}
	}
}

//释放内存
void LRUCacheFree(LRUCache* obj)
{
	for (int i = 0; i < 100001; i++)
	{
		if (obj->cache[i] != NULL)
		{
			free(obj->cache[i]);
		}
	}
	free(obj->cache);
	free(obj->head);
	free(obj->tail);
	free(obj);
}

int main()
{
	LRUCache* obj = creatLRUCache(2);
	setLRUCacheValue(obj, 1, 1);
	setLRUCacheValue(obj, 2, 2);
	printf("%d\n", getLRUCacheValue(obj, 1));
	setLRUCacheValue(obj, 3, 3);
	printf("%d\n", getLRUCacheValue(obj, 2));
	setLRUCacheValue(obj, 4, 4);
	printf("%d\n", getLRUCacheValue(obj, 1));
	printf("%d\n", getLRUCacheValue(obj, 3));
	printf("%d\n", getLRUCacheValue(obj, 4));
	LRUCacheFree(obj);
	system("pause");
	return 0;
}

参考:https://blog.csdn.net/Conner7/article/details/136572016

相关推荐
维诺菌17 分钟前
claude code安装
java·开发语言·ai编程·calude
谙弆悕博士18 分钟前
快速学C语言—— 第0章:C语言简介
c语言·开发语言·经验分享·笔记·程序人生·课程设计·学习方法
顶点多余30 分钟前
自定义协议、序列化、反序列化实现
java·linux·开发语言·c++·tcp/ip
.柒宇.32 分钟前
Redis高频面试题与跳跃表原理详解
数据库·redis·缓存
风味蘑菇干40 分钟前
使用接口定义规范,实现类完成具体逻辑。
java·开发语言
MATLAB代码顾问40 分钟前
【智能优化】无穷优化算法(INFO)原理与Python实现
开发语言·python·算法
2401_833269301 小时前
Java多线程:从入门到进阶
java·开发语言
z200509301 小时前
C++中的右值引用
开发语言·c++
SilentSamsara1 小时前
迭代器协议:`__iter__` / `__next__` 的完整执行流程
开发语言·人工智能·python·算法·机器学习
平凡但不平庸的码农1 小时前
Go Channel详解
开发语言·后端·golang