嵌入式八股文面试题(二)C语言算法

相关概念请查看文章:C语言概念。

1. 如何实现一个简单的内存池?

简单实现:

#include <stdio.h>
#include <stdlib.h>//内存块
typedef struct MemoryBlock {void *data; // 内存块起始地址struct MemoryBlock *next; // 下一个内存块的地址
} MemoryBlock;//内存池
typedef struct MemoryPool {MemoryBlock *freeList; // 空闲内存块链表MemoryBlock *usedList; // 占用内存块链表int freeCount; // 空闲内存块数量int usedCount; // 占用内存块数量int blockCount; // 内存块总数量
} MemoryPool;
//初始化内存池
MemoryPool *InitMemoryPool(int blockSize, int blockCount) {MemoryPool *pool = (MemoryPool *)malloc(sizeof(MemoryPool)); // 为内存池分配空间if (pool == NULL) {printf("Failed to allocate memory pool!\n");return NULL;}pool->freeList = NULL;pool->usedList = NULL;pool->freeCount = 0;pool->usedCount = 0;pool->blockCount = blockCount;for (int i = 0; i < blockCount; i++) {// 创建内存块节点,插入到空闲链表MemoryBlock *block = (MemoryBlock *)malloc(sizeof(MemoryBlock));block->data = malloc(blockSize);block->next = pool->freeList;pool->freeList = block;pool->freeCount++;}return pool;
}
//分配内存块
void *AllocateBlock(MemoryPool *pool) {if (pool->freeList == NULL || pool->freeCount == 0) {printf("No free blocks available!\n");return NULL;}MemoryBlock *node = pool->freeList;// 将该内存块从空闲链表删除pool->freeList = node->next;// 将该内存块插入到占用链表node->next = pool->usedList;pool->usedList = node;// 更新空闲和占用状态pool->usedCount++;pool->freeCount--;return node->data;
}
//释放内存块
void FreeBlock(MemoryPool *pool, void *data) {MemoryBlock *cur = pool->usedList;MemoryBlock *pre = NULL;// 寻找该内存块的节点while (cur != NULL && cur->data != data) {pre = cur;cur = cur->next;}if (cur == NULL) {printf("Error: Data not found!\n");return;}// 将该内存块从占用链表删除if (pre != NULL)pre->next = cur->next;elsepool->usedList = cur->next;// 将该内存块插入到空闲链表cur->next = pool->freeList;pool->freeList = cur;pool->freeCount++;pool->usedCount--;
}
//销毁内存块
void DestroyMemoryPool(MemoryPool *pool) {if (pool == NULL) return;MemoryBlock *cur = NULL;// 释放所有空闲内存块空间while (pool->freeList != NULL) {cur = pool->freeList;pool->freeList = pool->freeList->next;free(cur->data);free(cur);}// 释放所有占用内存块空间while (pool->usedList != NULL) {cur = pool->usedList;pool->usedList = pool->usedList->next;free(cur->data);free(cur);}// 释放内存池空间free(pool);
}
int main(void) {MemoryPool *pool;pool = InitMemoryPool(10, 5); // 初始化内存池int *str = (int *)AllocateBlock(pool);  //申请内存块1*str = 2;int *ptr = (int *)AllocateBlock(pool); //申请内存块2*ptr = 3;printf("free block : %d, used block : %d\n", pool->freeCount, pool->usedCount);FreeBlock(pool, ptr); //释放内存块2printf("free block : %d, used block : %d\n", pool->freeCount, pool->usedCount);DestroyMemoryPool(pool); return 0;
}

打印结果: 

2. 实现一个双向链表。

        双向链表是一种每个节点都有两个指针,一个指向下一个节点,一个指向前一个节点的数据结构。可以在任意位置进行快速插入和删除。

#include <stdio.h>
#include <stdlib.h>// 双向链表节点
typedef struct Node {int data;struct Node *prev; //连接前一个节点的指针struct Node *next; //连接下一个节点的指针
} Node;// 创建新节点
Node* createNode(int data) {Node *newNode = (Node *)malloc(sizeof(Node));newNode->data = data;newNode->next = NULL;newNode->prev = NULL;return newNode;
}// 插入节点到链表的尾部
void append(Node **head, int data) {Node *newNode = createNode(data);if (*head == NULL) {*head = newNode;} else {Node *temp = *head;while (temp->next != NULL) {temp = temp->next;}temp->next = newNode;newNode->prev = temp;}
}
//删除一个节点
void delete_node(Node **head, int data) {if (*head == NULL){  // 如果链表为空printf("链表为空,没有要删除的元素\n");return;}Node *temp = *head;// 如果删除的是头节点if (temp->data == data) {*head = temp->next;  // 更新头节点if (*head != NULL) {  // 如果不是空链表(*head)->prev = NULL;}free(temp);return;}// 找到要删除的节点while (temp != NULL && temp->data != data) {temp = temp->next;}// 如果没有找到该节点if (temp == NULL) {printf("未找到数据为 %d 的节点\n", data);return;}// 删除的是中间或尾部节点if (temp->next != NULL) {temp->next->prev = temp->prev;  // 更新下一个节点的prev指针}if (temp->prev != NULL) {temp->prev->next = temp->next;  // 更新前一个节点的next指针}free(temp);
}
// 打印双向链表
void printList(Node *head) {Node *temp = head;while (temp != NULL) {printf("%d <-> ", temp->data);temp = temp->next;}printf("NULL\n");
}int main() {Node *head = NULL;append(&head, 10);append(&head, 20);append(&head, 30);printList(head);delete_node(&head, 30);printList(head);return 0;
}

打印结果:

3. 实现一个线程池。

   

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Python】集合

个人主页&#xff1a;GUIQU. 归属专栏&#xff1a;Python 文章目录 1. 集合的创建2. 集合的基本操作2.1 访问集合元素2.2 添加元素2.3 删除元素 3. 集合的数学运算3.1 交集&#xff08;& 或 intersection() 方法&#xff09;3.2 并集&#xff08;| 或 union() 方法&#xf…

Flutter_学习记录_基本组件的使用记录_2

1. PopupMenuButton的使用 代码案例&#xff1a; import package:flutter/material.dart;// ----PopupMemuButtonDemo的案例---- class PopupMemuButtonDemo extends StatefulWidget {const PopupMemuButtonDemo({super.key});overrideState<PopupMemuButtonDemo> crea…

基于java手机销售网站设计和实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…

初识计算机网络

从此篇我将开始网络新篇章&#xff01; 1. 网络发展史 最初的计算机之间相互独立存在&#xff0c;每个计算机只能持有自己的数据&#xff0c;数据无法共享。此时的计算机为独立模式 随着时代的发展&#xff0c;越来越需要计算机之间互相通信&#xff0c;共享软件和数据&#x…

PyTorch 中 `torch.cuda.amp` 相关警告的解决方法

在最近的写代码过程中&#xff0c;遇到了两个与 PyTorch 的混合精度训练相关的警告信息。这里随手记录一下。 警告内容 警告 1: torch.cuda.amp.autocast FutureWarning: torch.cuda.amp.autocast(args...) is deprecated. Please use torch.amp.autocast(cuda, args...) i…

【PS 2022】Adobe Genuine Service Alert 弹出

电脑总是弹出Adobe Genuine Service Alert弹窗 1. 不关掉弹窗并打开任务管理器&#xff0c;找到Adobe Genuine Service Alert&#xff0c;并右键进入文件所在位置 2 在任务管理器中结束进程并将文件夹中的 .exe 文件都使用空文档替换掉 3. 打开PS不弹出弹窗&#xff0c;解决&a…

Vue2生命周期面试题

在 Vue 2 中&#xff0c;this.$el 和 this.$data 都是 Vue 实例的属性&#xff0c;代表不同的内容。 1. this.$el this.$el 是 Vue 实例的根 DOM 元素&#xff0c;它指向 Vue 实例所控制的根节点元素。在 Vue 中&#xff0c;el 是在 Vue 实例创建时&#xff0c;指定的根元素&…

unity 安装Entities

因为Entities目前不支持用资源名动态加载资源&#xff01;没错&#xff0c;AssetsBundle或Addressables都不能用于Entities&#xff1b;也就意味着现阶段不能用Entities开发DLC或热更游戏。 Entities必须使用SubScene&#xff0c;而SubScene不能从资源动态加载&#xff0c;路被…

基于 PyTorch 的树叶分类任务:从数据准备到模型训练与测试

基于 PyTorch 的树叶分类任务&#xff1a;从数据准备到模型训练与测试 1. 引言 在计算机视觉领域&#xff0c;图像分类是一个经典的任务。本文将详细介绍如何使用 PyTorch 实现一个树叶分类任务。我们将从数据准备开始&#xff0c;逐步构建模型、训练模型&#xff0c;并在测试…

团结引擎 Shader Graph:解锁图形创作新高度

Shader Graph 始终致力于为开发者提供直观且高效的着色器构建工具&#xff0c;持续推动图形渲染创作的创新与便捷。在团结引擎1.4.0中&#xff0c;Shader Graph 迎来了重大更新&#xff0c;新增多项强大功能并优化操作体验&#xff0c;助力开发者更轻松地实现高质量的渲染效果与…

C# OpenCV机器视觉:模仿Halcon各向异性扩散滤波

在一个充满创意与挑战的图像处理工作室里&#xff0c;阿强是一位热情的图像魔法师。他总是在追求更加出色的图像效果&#xff0c;然而&#xff0c;传统的图像处理方法有时候并不能满足他的需求。 有一天&#xff0c;阿强听说了 Halcon 中的各向异性扩散滤波功能&#xff0c;它…

超详细的数据结构3(初阶C语言版)栈和队列。

文章目录 栈和队列1.栈1.1 概念与结构1.2 栈的实现 2. 队列2.1 概念与结构2.2 队列的实现 总结 栈和队列 1.栈 1.1 概念与结构 栈&#xff1a;⼀种特殊的线性表&#xff0c;其只允许在固定的⼀端进行插⼊和删除元素操作。进⾏数据插⼊和删除操作的⼀端称为栈顶&#xff0c;另…

利用邮件合并将Excel的信息转为Word(单个测试用例转Word)

利用邮件合并将Excel的信息转为Word 效果一览效果前效果后 场景及问题解决方案 一、准备工作准备Excel数据源准备Word模板 二、邮件合并操作步骤连接Excel数据源插入合并域预览并生成合并文档 效果一览 效果前 效果后 场景及问题 在执行项目时的验收阶段&#xff0c;对于测试…

一个基于ESP32S3和INMP441麦克风实现音频强度控制RGB灯带律动的代码及效果展示

一个基于ESP32S3和INMP441麦克风实现音频强度控制RGB灯带律动的代码示例&#xff0c;使用Arduino语言&#xff1a; 硬件连接 INMP441 VCC → ESP32的3.3VINMP441 GND → ESP32的GNDINMP441 SCK → ESP32的GPIO 17INMP441 WS → ESP32的GPIO 18INMP441 SD → ESP32的GPIO 16RG…

用户认证综合实验

实验需求 需求一&#xff1a;根据下表&#xff0c;完成相关配置 需求二&#xff1a;配置DHCP协议&#xff0c;具体要求如下 需求三&#xff1a;防火墙安全区域配置 需求四&#xff1a;防火墙地址组信息 需求五&#xff1a;管理员 为 FW 配置一个配置管理员。要求管理员可以通…

Curser2_解除机器码限制

# Curser1_无限白嫖试用次数 文末有所需工具下载地址 Cursor Device ID Changer 一个用于修改 Cursor 编辑器设备 ID 的跨平台工具集。当遇到设备 ID 锁定问题时&#xff0c;可用于重置设备标识。 功能特性 ✨ 支持 Windows 和 macOS 系统&#x1f504; 自动生成符合格式的…

linux部署node服务

1、安装nvm管理node版本 # 下载、解压到指定目录 wget https://github.com/nvm-sh/nvm/archive/refs/tags/v0.39.1.tar.gz tar -zxvf nvm-0.39.0.tar.gz -C /opt/nvm # 配置环境 vim ~/.bashrc~&#xff1a;这是一个路径简写符号&#xff0c;代表当前用户的主目录。在大多数 …

Kotlin实战经验:将接口回调转换成suspend挂起函数

在 Kotlin 协程中, suspendCoroutine 和 suspendCancellableCoroutine 是用于将回调或基于 future 的异步操作转换成挂起函数。 suspendCoroutine 用途:将回调式异步操作转换为可挂起函数 行为: 启动一个新的协程来处理基于回调的操作挂起当前协程,直到调用回调回调负责…

【DeepSeek服务器繁忙,请稍后再试...如何解决?】

DeepSeek服务器繁忙&#xff0c;请稍后再试...如何解决&#xff1f; DeepSeek该咋使用&#xff1f;解决办法&#xff1a;本地桌面工具接下来说下&#xff0c;DeepSeek提示词该咋写&#xff1f; DeepSeek该咋使用&#xff1f; 首先&#xff0c;先说下DeepSeek该咋使用&#xff…

SDKMAN! 的英文全称是 Software Development Kit Manager(软件开发工具包管理器)

文章目录 SDKMAN! 的核心功能SDKMAN! 的常用命令SDKMAN! 的优势总结 SDKMAN! 的英文全称是 Software Development Kit Manager。它是一个用于管理多个软件开发工具&#xff08;如 Java、Groovy、Scala、Kotlin 等&#xff09;版本的工具。SDKMAN! 提供了一个简单的方式来安装、…