内存泄漏检测、单向链表的操作

我要成为嵌入式高手之3月19日数据结构第二天!!
————————————————————————————

valgrind内存测试工具

让虚拟机上网、在虚拟机上下载软件,参考笔记:

我要成为嵌入式高手之2月3日Linux高编第一天!!-CSDN博客

上图表示申请了10个空间,释放了10个空间,没有内存泄漏

上图申请了11个空间,释放了10个空间,存在内存泄漏(leaked memory) 

 单向链表逆序

#include "head.h"

LINK_LIST *CreateLink()
{
    LINK_LIST *plist = malloc(sizeof(LINK_LIST));
    if (NULL == plist)
    {
        perror("fail to malloc");
        return NULL;
    }

    plist->phead = NULL;
    plist->clen = 0;

    return plist;
}

int LinkSearch(LINK_LIST *plist)
{
    LINK_NODE *ptmp = plist->phead;

    while (ptmp != NULL)
    {
        printf("%d\n", ptmp->data);
        ptmp = ptmp->pnext;
    }

    printf("len = %d\n", plist->clen);

    return 0;
}

int PushTailLink(LINK_LIST *plist, DATA_TYPE data)
{
    LINK_NODE *ptmp = plist->phead;

    LINK_NODE *pnode = malloc(sizeof(LINK_NODE));
    if (NULL == pnode)
    {
        perror("fail to malloc pnode");
        return -1;
    }

    pnode->data = data;
    pnode->pnext = NULL;

    if (plist->phead == NULL)
    {
        plist->phead = pnode;
    }
    else
    {
        while (ptmp->pnext != NULL)
        {
            ptmp = ptmp->pnext;
        }
        ptmp->pnext = pnode;
        plist->clen++;
    }

    return 0;
}

int ReverseLink(LINK_LIST *plist)
{
    if (plist->phead == NULL)
    {
        return -1;
    }

    LINK_NODE *ptmp = plist->phead;
    plist->phead = NULL;
    
    LINK_NODE *pinsert = NULL;
    
    while (ptmp != NULL)
    {
        pinsert = ptmp;
        ptmp = ptmp->pnext;
  
        pinsert->pnext = plist->phead;
        plist->phead = pinsert;
    }
    
    return 0;
}

int main()
{
    LINK_LIST *plist = NULL;

    plist = CreateLink();
    if (NULL == plist)
    {
        return -1;
    }

    PushTailLink(plist, 1);
    PushTailLink(plist, 2);
    PushTailLink(plist, 3);
    PushTailLink(plist, 4);
    PushTailLink(plist, 5);

    LinkSearch(plist);

    ReverseLink(plist);

    printf("=========================\n");
    LinkSearch(plist);

    return 0;
}

找单向链表的中间节点

 

LINK_NODE *SearchMidNode(LINK_LIST *plist)
{
    LINK_NODE *pfast = plist->phead;
    LINK_NODE *pslow = plist->phead;

    while (pfast != NULL)
    {
        pfast = pfast->pnext;
        if (NULL == pfast)
        {
            break;
        }
        pfast = pfast->pnext;
        pslow = pslow->pnext;

    }

    return pslow;
}

寻找链表倒数第K个结点

LINK_NODE *SearchReNoKNode(LINK_LIST *plist, int k)
{
	LINK_NODE *pfast = plist->phead;
	LINK_NODE *pslow = pfast;
    int i = 0;
	
    for (i = 0; i < k; i++)
	{
		if (NULL == pfast)
		{
			return NULL;
		}
		pfast = pfast->pnext;
	}

	while (pfast != NULL)
	{
		pfast = pfast->pnext;
		pslow = pslow->pnext;
	}
	
	return pslow;
}

删除指定数据的结点

int DeleteKNode(LINK_LIST *plist, int k)
{
    LINK_NODE *pfree = NULL;
    LINK_NODE *ptmp = NULL;

    pfree = plist->phead;
    ptmp = pfree;
    while (pfree != NULL)
    {
        if (pfree->data == k)
        {
            if (plist->phead == pfree)
            {
                plist->phead = pfree->pnext;
                free(pfree);
                plist->clen--;
                break;
            }
            else
            {
                ptmp->pnext = pfree->pnext;
                free(pfree);
                plist->clen--;
                break;
            }
        }
        else
        {
            ptmp = pfree;
            pfree = pfree->pnext;
        }
    }

    return 0;
}

 链表的插入排序

int InsertSort(LINK_LIST *plist)
{
    LINK_NODE *ptmp = NULL;
    LINK_NODE *pinsert = NULL;
    LINK_NODE *p = NULL;

    if (p == NULL || p->pnext == NULL)
    {
        return -1;
    }

    ptmp = plist->phead->pnext;
    plist->phead->pnext = NULL;
    pinsert = ptmp;

    while (ptmp != NULL)
    {
        pinsert = ptmp;
        ptmp = ptmp->pnext;

        if (pinsert->data <= plist->phead->data)
        {
            pinsert->pnext = plist->phead;
            plist->phead = pinsert;
        }
        else
        {
            LINK_NODE *p = plist->phead;
            while (p->pnext != NULL && p->pnext->data < pinsert->data)
            {
                p = p->pnext;
            }

            pinsert->pnext = p->pnext;
            p->pnext = pinsert;
        }
    }
    return 0;
}

 

                                                                                                                                                                                      

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

IPD集成产品开发:塑造企业未来竞争力的关键

随着市场竞争的日益激烈&#xff0c;企业对产品开发的要求也越来越高。如何在快速变化的市场环境中&#xff0c;既保证产品的批量生产效率&#xff0c;又满足客户的个性化需求&#xff0c;成为了企业面临的重要挑战。IPD&#xff08;集成产品开发&#xff09;模式&#xff0c;作…

【单点知识】基于实例讲解PyTorch中的Transforms类

文章目录 0. 前言1. 基本用法1.1 转换为Tensor1.2 图像大小调整1.3 随机裁剪1.4 中心裁剪1.5 随机翻转1.6 随机旋转1.7 填充1.8 组合变换 2. 进阶用法2.1 归一化2.2 色彩空间转换2.3 颜色抖动2.4 随机仿射2.5 透视变换2.6 自定义变换 0. 前言 按照国际惯例&#xff0c;首先声明…

Linux 常用操作命令大全

目录 一、命令大集合 1.1 whereis 1.2 which 1.3 sudo 1.4 grep 1.5 free 1.6 top 动态显示进程的状态 1.7 ps 静态显示进程信息 1.8 df 1.9 iostat 看IO性能状态 1.10 yum安装插件命令 1.11 rpm 1.12 scp远程拷贝 1.13 uname 二、linux网络命令 2.1 centos7 防火…

数据库只追求性能是不够的!

那些成功的数据库公司没有一家是通过性能比竞争对手更快而成功的。 作者&#xff1a;JORDAN TIGANI&#xff0c;DuckDB 公司 MotherDuck 联合创始人&CEO 本文和封面来源&#xff1a;https://motherduck.com/&#xff0c;爱可生开源社区翻译。 本文约 4500 字&#xff0c;预…

autojsx使用

工具&#xff1a; 投屏软件&#xff1a;https://www.sigma-rt.com/tc/download/ autojsx&#xff1a;https://github.com/kkevsekk1/AutoX/releases 开发文档&#xff1a;http://doc.autoxjs.com/#/ 开发工具&#xff1a;https://code.visualstudio.com/ vscode插件&#xff1a…

《世界之外》玩家闹上315,乙游打响维权大战

315维权微博的评论区&#xff0c;竟然被举报网易的玩家占领了。 玩家举报网易乙游《世界之外》虚假宣传侵害消费者权益&#xff0c;在游戏中设置排行榜和专属商店将玩家分为三六九等&#xff0c;诱导玩家消费氪金&#xff0c;强烈要求网易打开退款通道。 目前大批玩家举报的举…

【Leetcode】1793. 好子数组的最大分数

文章目录 题目思路代码复杂度分析时间复杂度空间复杂度 结果总结 题目 题目链接&#x1f517; 给你一个整数数组 n u m s nums nums &#xff08;下标从 0 0 0 开始&#xff09;和一个整数 k k k 。 一个子数组 ( i , j ) (i, j) (i,j) 的 分数 定义为 m i n ( n u m s …

YOLOv5目标检测学习(6):源码解析之:训练部分train.py

文章目录 前言一、导入相关包与配置二、主函数main2.1 checks&#xff1a;检查rank值来判断是否打印参数、检查git仓库、检查包的安装2.2 判断是否恢复上一次模型训练提问&#xff1a;opt.data, opt.cfg, opt.hyp, opt.weights, opt.project各是什么&#xff1f; 2.3 DDP mode&…

HarmonyOS NEXT应用开发之swiper指示器导航点位于swiper下方

介绍 本示例介绍通过分割swiper区域&#xff0c;实现指示器导航点位于swiper下方的效果。 效果预览图 使用说明 加载完成后swiper指示器导航点&#xff0c;位于显示内容下方。 实现思路 将swiper区域分割为两块区域&#xff0c;上方为内容区域&#xff0c;下方为空白区域。…

Linux权限维持后门及应急响应

本次应急响应实验用kali和centos7来充当攻击机和靶机 kali&#xff1a;192.168.10.130 centos7&#xff1a;192.168.10.155 前提&#xff1a; 用kali连接到centos7上面ssh root192.168.10.155 一、SSH软链接 任意密码登录即可发现程度&#xff1a;|||||| ln -sf /usr/sbi…

Learn OpenGL 17 立方体贴图

立方体贴图 我们已经使用2D纹理很长时间了&#xff0c;但除此之外仍有更多的纹理类型等着我们探索。在本节中&#xff0c;我们将讨论的是将多个纹理组合起来映射到一张纹理上的一种纹理类型&#xff1a;立方体贴图(Cube Map)。 简单来说&#xff0c;立方体贴图就是一个包含了…

【论文阅读】Improved Denoising Diffusion Probabilistic Models

Improved Denoising Diffusion Probabilistic Models 文章目录 Improved Denoising Diffusion Probabilistic Models概述Improving the Log-likelihoodLearning ∑ θ ( x t , t ) \sum_{\theta}(x_{t}, t) ∑θ​(xt​,t)Improving the Noise ScheduleReducing Gradient Nois…

AV1:帧内预测(一)

​VP9支持10种帧内预测模式&#xff0c;包括8种角度模式和非角度模式DC、TM(True Motion)模式&#xff0c;AV1在其基础上进一步扩展&#xff0c;AV1帧内预测角度模式更细化&#xff0c;同时新增了部分非角度模式。 扩展的角度模式 AV1在VP9角度模式的基础上进一步扩展&#xf…

Linux系统学习总结(上)

B站大学地址&#xff1a;第二章-04-ls命令的参数和选项_哔哩哔哩_bilibili 操作系统概述 1、计算机是由硬件和软件两部分组成的 2、操作系统是软件的一类&#xff0c;主要作用是协助用户调度硬件工作&#xff0c;充当用户和计算机硬件之间的桥梁 3、常见的操作系统分为两类…

C++ Primer Plus第十七章笔记

目录 1. C输入和输出概述 1.1 流、缓冲区和iostream 1.2 重定向 2. 使用cout进行输出 2.1 修改显示时使用的计数系统 2.2 调整字段宽度 2.3 填充字符 2.4 设置浮点数的显示精度 2.5 打印末尾的0或小数点 2.6 setf() 2.7 头文件iomanip 3. 使用cin进行输入 3.1 cin…

什么是组态软件?Web组态软件又是什么?

从事相关工作的对“组态软件”应该都不陌生&#xff0c;那Web组态软件又是什么呢?本文将对Web组态可视化软件&#xff08;下称“Web组态软件”&#xff09;做简单介绍&#xff0c;可视化编辑器是Web组态软件中的一个重要功能模块。除了编辑器&#xff0c;还有哪些功能模块?又…

嵌入式汇编语言简介

嵌入式汇编语言是一种在嵌入式系统开发中广泛使用的编程语言&#xff0c;它直接操作底层硬件资源&#xff0c;具有高效性和灵活性。本文将介绍嵌入式汇编语言的基本概念、特点以及应用场景。 以下是我整理的关于嵌入式开发的一些入门级资料&#xff0c;免费分享给大家&#xf…

Spring之@Value注解

前言 Value注解在Spring的依赖注入中占据重要地位,这里对Value注解的作用进行演示以及扩展 作用 注入字符串注入属性注入bean其他 代码准备 创建两个普通的bean Component public class ValueComponent { } Component public class Foo {private String sign;public Foo…

Linux编译器--gcc/g++的使用

1. gcc与g gcc与g分别是c语言与c代码的编译器&#xff0c;但同时g也兼容c语言。 我们知道在Linux中&#xff0c;系统并不以文件后缀来区分文件类别。但对于gcc与g等编译器而言却是需要的。Linux中c代码文件的后缀是.c&#xff0c;c代码文件的后缀是.cpp(.cc)(.cxx)。 在Linu…

linux安装Redis且搭建主从、哨兵、集群以及使用(超详细)

一.Redis简介 1.NoSQL简介 ​ 目前市场主流数据存储都是使用关系型数据库。每次操作关系型数据库时都是I/O操作&#xff0c;I/O操作是主要影响程序执行性能原因之一&#xff0c;连接数据库关闭数据库都是消耗性能的过程。尽量减少对数据库的操作&#xff0c;能够明显的提升程…