LRU缓存结构【C语言】

news2024/11/28 16:48:23
#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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1586930.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

sonar搭建(linux系统)

前景 静态代码扫描是CI/CD中重要的一环&#xff0c;可以在代码提交到代码仓库之后&#xff0c;在CI/CD流程中加入代码扫描步骤&#xff0c;从而及时地对代码进行质量的检查。这可以有效地降低后期维护成本&#xff0c;优化产品质量&#xff0c;提高产品交付速度。同时&#xf…

世界需要和平--中介者模式

1.1 世界需要和平 "你想呀&#xff0c;国与国之间的关系&#xff0c;就类似于不同的对象与对象之间的关系&#xff0c;这就要求对象之间需要知道其他所有对象&#xff0c;尽管将一个系统分割成许多对象通常可以增加其可复用性&#xff0c;但是对象间相互连接的激增又会降低…

Capture One 23 Enterprise for Mac中文版 全面的图像处理工具

Capture One 23 Enterprise for Mac中文版一款专业的图像编辑和管理软件&#xff0c;具备强大的功能和工具&#xff0c;适用于摄影师、摄影工作室和专业用户。 软件下载&#xff1a;Capture One 23 Enterprise for Mac中文版下载 该软件为用户提供了全面的图像处理工具&#xf…

word中插入mathtype版的符号后,行间距变大解决方法

问题 解决方法 选中该段&#xff0c;设置固定值行距。如果是宋体&#xff0c;小四&#xff0c;1.25行距&#xff0c;那么固定值就为20磅。 成功解决。

[大模型]ChatGLM3-6B Transformers部署调用

ChatGLM3-6B Transformers部署调用 环境准备 在autodl平台中租一个3090等24G显存的显卡机器&#xff0c;如下图所示镜像选择PyTorch–>2.0.0–>3.8(ubuntu20.04)–>11.8 接下来打开刚刚租用服务器的JupyterLab&#xff0c;并且打开其中的终端开始环境配置、模型下载…

生成式伪造语音安全问题与解决方案(下)

文章目录 前言三、伪造语音的检测技术(一)伪造语音检测算法(二)伪造语音检测应用(三)伪造语音检测未来发展方向(四)伪造语音检测技术面临的挑战四、生成式伪造语音治理体系的构建(一)技术应用层面(二)制度规范层面1、规范技术分类分级标准2、健全伪造语音技术监管体…

Java日期正则表达式(附Demo)

目录 前言1. 基本知识2. Demo 前言 对于正则匹配&#xff0c;在项目实战中运用比较广泛 原先写过一版Python相关的&#xff1a;ip和端口号的正则表达式 1. 基本知识 对于日期的正则相对比较简单 以下是一些常见的日期格式及其对应的正则表达式示例&#xff1a; 年-月-日&a…

ES6 全详解 let 、 const 、解构赋值、剩余运算符、函数默认参数、扩展运算符、箭头函数、新增方法,promise、Set、class等等

目录 ES6概念ECMAScript6简介ECMAScript 和 JavaScript 的关系ES6 与 ECMAScript 2015 的关系 1、let 、 const 、var 区别2、变量解构赋值1、数组解构赋值2、对象解构赋值3、字符串的解构赋值 3、展开剩余运算符1、**展开运算符(...)**2、**剩余运算符(...)** 4、函数的拓展函…

Windows终端添加git bash

环境&#xff1a;windows11 终端&#xff1a;windows terminal git bash默认的界面不太好看&#xff0c;添加到终端会比较好用 步骤 打开 windows terminal&#xff0c;在向下箭头 点击 设置左侧栏 点击 “添加新配置文件”&#xff0c;如下图配置&#xff0c;主要修改项&…

系统开发实训小组作业week7 —— 优化系统开发计划

目录 1. 建立规则&#xff0c;仪式&#xff0c;流程&#xff0c;模式 2. 给好行为正面的反馈 3. 明确指出不合适的行为&#xff0c;必要时调整人员 在 “系统开发实训课程” 中&#xff0c;我们小组的项目是 “电影院会员管理系统” 。在项目的开发过程中&#xff0c;我们遇…

全国口腔经销商大会暨口腔行业交流发展论坛【SDHE相约深圳】

全国口腔经销商大会暨口腔行业交流与发展论坛【SDHE相约深圳】 一、活动介绍与宗旨 1.主题&#xff1a;规范 共享 赋能 融合 2.时间和地址 &#xff1a;2024年12月 5日 深圳国际会展中心&#xff08;宝安&#xff09; 3.宗旨 促进口腔产业链的优化与升级&#xff0c;推动口…

ETL中如何运用好MQ消息集成

一、ETL的主要作用 ETL&#xff08;Extract, Transform, Load&#xff09;是数据仓库中的关键环节&#xff0c;其主要作用是将数据从源系统中抽取出来&#xff0c;经过转换和清洗后加载到数据仓库中。具体而言&#xff1a; Extract&#xff08;抽取&#xff09;&#xff1a;从…

跟着Carl大佬学leetcode之27 移除元素

来点强调&#xff0c;刷题是按照代码随想录的顺序进行的&#xff0c;链接如下https://www.programmercarl.com/本系列是记录一些刷题心得和学习过程&#xff0c;就看到题目自己先上手试试&#xff0c;然后看程序员Carl大佬的解释&#xff0c;自己再敲一遍修修补补&#xff0c;练…

套接字通信模型

本文内容主要参考《Android图形显示系统》 套接字也就是socket&#xff0c;一般用于网络中两个主机之间应用进程进行通信&#xff0c;在同一个主机也可以使用套接字完成进程之间的通信。 在图形显示系统中&#xff0c;用到套接字进行通信的地方主要有VSync信号的分发以及输入事…

Freemarker 的配置

Freemarker是一种用于生成动态模板的Java模板引擎。它可以将数据与模板文件结合&#xff0c;生成最终的输出内容。以下是使用Freemarker的实现和配置步骤&#xff1a; 引入Freemarker库&#xff1a;首先需要将Freemarker库添加到项目的依赖中。可以通过在Maven或Gradle中添加相…

idea: 没有 new java class

如图&#xff1a; 解决&#xff1a; 右键点击--> Mark Directory as --> Sources Root ok

简单问题之字符类总结

2023 考点&#xff1a;字符串string的用法 可参考这篇文章 思路&#xff1a; 常用函数&#xff1a; string s; getline(cin,s);//一行读入字符功能 string s3s1s2;//字符串的拼接 子串简写 思路&#xff1a; 对于字符串问题先考虑用暴力&#xff08;双指针&#xff09;是否能…

【Qt】事件

目录 一、介绍 二、进入离开事件 三、鼠标事件 3.1 鼠标单击事件 3.2 鼠标释放事件 3.3 鼠标双击事件 3.4 鼠标移动事件 3.5 滚轮事件 四、按键事件 4.1 单个按键 4.2 组合按键 五、定时器 5.1 QTimerEvent类 5.2 QTimer类 5.3 获取系统日期及时间 六、窗口移…

20 Games101 - 笔记 - 光场、颜色与感知

**20 ** 光场、颜色与感知 光场 眼睛成像 眼睛成像&#xff1a;我们看到这个三维世界&#xff0c;在眼睛里类似就是一幅二维的图。如果直接看到一幅记录了看到的光线信息的图&#xff0c;也能得到同样效果&#xff08;虚拟现实&#xff09;。 全光函数 全光函数可以描述…

基因组组装:Hifiasm 使用教程

简介 Hifiasm[1] 是一个快速的单倍型解析 de novo 组装软件&#xff0c;最初设计用于 PacBio HiFi 读取。其最新版本可以通过利用超长的 Oxford Nanopore 读取支持端粒到端粒的组装。Hifiasm 可以生成单样本端粒到端粒的组装&#xff0c;结合了 HiFi、超长和 Hi-C 读取&#xf…