当前位置: 首页 > news >正文

嵌入式数据结构笔记(二):内存工具与链表操作

1.Valgrind 简介

Valgrind 是 GNU 提供的开源内存调试工具,主要用于检测以下问题:

  • 内存错误(如非法访问、越界读写)
  • 内存泄漏(已分配但未释放的内存)
2.Valgrind 安装

网络配置
确保系统网络连接正常,以下为典型安装流程图示。

解除系统锁

        安装的时候报错,需要sudo命令来删除锁,删除完再安装。

sudo rm /var/lib/dpkg/lock-frontend  
sudo rm /var/lib/dpkg/lock  

安装工具

sudo apt-get install valgrind  

运行检测
通过以下命令检测程序内存问题:

valgrind ./a.out  

2.链表核心操作

查找算法

  • 中间节点:使用快慢指针法,快指针每次移动两步,慢指针每次移动一步。
  • 倒数第k节点:双指针法,前指针先移动k步,后指针再同步移动。
    //查找中间结点,不知道长度的情况下
    Node_t *midnode(Link_t *plink)
    {if(plink->phead == NULL){return NULL;}Node_t *ptmp = plink->phead;int len = 0, i;while(ptmp){ptmp = ptmp->pnext;++len;}ptmp = plink->phead;for(i = 1;i <= len / 2  ;++i){ptmp = ptmp->pnext;}return ptmp;
    }//快慢指针法找中间结点(时间复杂度低)
    Node_t *fsmidnode(Link_t *plink)
    {if(plink->phead == NULL){return NULL;}Node_t *pfast = plink->phead;Node_t *pslow = plink->phead;while(NULL != pfast){pfast = pfast -> pnext;if(NULL == pfast){break;}pfast = pfast -> pnext;pslow = pslow -> pnext;}return pslow;
    }
    
//查找倒数第k个结点,不知道长度的情况下
Node_t *k(Link_t *plink, int k)
{if(plink->phead == NULL){return NULL;}Node_t *ptmp = plink->phead;int len = 0, i;while(ptmp){ptmp = ptmp->pnext;++len;}ptmp = plink->phead;for(i = 1;i <= len - k;++i){ptmp = ptmp->pnext;}return ptmp;
}//快慢指针找倒数第k个
Node_t *knode(Link_t *plink, int k)
{if(plink->phead == NULL){return NULL;}Node_t *pfast = plink->phead;Node_t *pslow = plink->phead;int i;for(i = 1;i <= k;++i){if(NULL == pfast){return NULL;}pfast = pfast -> pnext;}while(NULL != pfast){pslow = pslow -> pnext;pfast = pfast -> pnext;}return pslow;
}

 

3.结构调整

  • 链表逆序:通过迭代或递归反转指针方向。
    void reverslink(Link_t *plink)
    {if(plink->phead == NULL){return;}Node_t *pinsert = NULL;Node_t *ptmp = plink->phead;plink->phead = NULL;while (ptmp != NULL){pinsert = ptmp;ptmp = ptmp->pnext;pinsert->pnext = plink->phead;plink->phead = pinsert;}
    }
    

  • 链表排序
    void insertSort(Link_t *plink)
    {if(plink->phead == NULL){return;}Node_t *pinsert = plink -> phead -> pnext;Node_t *ptmp = plink -> phead -> pnext;Node_t *p = plink -> phead;plink -> phead -> pnext = NULL;while(ptmp){ptmp = ptmp -> pnext;if(plink -> phead -> data >= pinsert -> data){pinsert -> pnext = plink -> phead;plink ->phead = pinsert;}else{p = plink -> phead;while(p -> pnext != NULL && (pinsert -> data) > (p -> pnext -> data)){p = p -> pnext;}pinsert -> pnext = p -> pnext;p -> pnext = pinsert;}pinsert = ptmp;}
    }

4.环链检测

  • 有环链表判断:快慢指针相遇即存在环。
    void ringlink(Link_t *plink)
    {if(plink->phead == NULL || plink -> phead -> pnext == NULL){return;}Node_t *ptmp = plink -> phead;while(ptmp -> pnext != NULL){ptmp = ptmp -> pnext;}ptmp -> pnext = plink -> phead;
    }int islinkring(Link_t *plink)
    {if(plink->phead == NULL || plink -> phead -> pnext == NULL){return 0;}Node_t *pfast = plink -> phead;Node_t *pslow = pfast;while(1){pfast = pfast -> pnext -> pnext -> pnext;pslow = pslow -> pnext;if(pfast == pslow && pfast != NULL && pslow != NULL){break;}}return 1;
    }
    

  • 约瑟夫问题:通过循环链表模拟 Elimination Game。
    Node_t *last_node(Link_t *plink, int clen)
    {ringlink(plink);Node_t *ptmp = plink -> phead;Node_t *p = ptmp;Node_t *q;while(clen != 1){q = ptmp -> pnext;ptmp = ptmp -> pnext -> pnext;p = ptmp -> pnext;free(ptmp);ptmp = p;q -> pnext = ptmp;--clen; } return p;
    }
    

4.链表类型解析
循环链表有环链表
首尾节点显式连接任意节点形成环结构

http://www.dtcms.com/a/314888.html

相关文章:

  • QT 如何实现enum与字符串的互转
  • Java基础学习(一):类名规范、返回值、注释、数据类型
  • 【QT】安装与配置
  • 应急响应复现
  • Java 课程,每天解读一个简单Java之正整数分解质因数
  • 字符集选择utf8mb4
  • android内存作假通杀补丁(4GB作假8GB)
  • 自动寻迹小车介绍、原理及应用场景
  • GoLand 项目从 0 到 1:第四天 —— 技术选型落地与方案设计
  • onnxruntime配置开启ACL加速Arm上的模型推理
  • 《Python 实用项目与工具制作指南》· 3.2 实战·开发密码管理器
  • 【教学类-52-17】20250803动物数独_空格尽量分散_只有一半关卡数(N宫格通用版3-10宫格)0图、1图、2图、6图、有答案、无答案 组合版24套
  • JavaScript 中的流程控制语句详解
  • JS-第二十天-事件(二)
  • 股票的涨跌原理
  • Flink从Kafka读取数据的完整指南
  • ref和reactive的区别
  • 图的存储方式-邻接表
  • 燃气末端天然气加臭剂四氢噻吩监测方案
  • lwIP 代码解析:sys_arch.c
  • 从 0 到 1 构建高质量微调数据集:大模型落地的基石
  • 单向链表练习
  • Linux Shell:常用命令汇总
  • 邻近标记技术:研究蛋白互作的利器(一)
  • 论文Review LIO Multi-session Voxel-SLAM | 港大MARS出品!体素+平面特征的激光SLAM!经典必读!
  • 简要探讨大型语言模型(LLMs)的发展历史
  • 每天学一个Linux命令(38):vi/vim
  • 决策树(回归树)全解析:原理、实践与应用
  • Excel商业智能分析报表 【销售管理分析仪】
  • 编译 Paddle 遇到 flashattnv3 段错误问题解决