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

嵌入式学习第二十九天!(数据结构的概念、单向链表)

数据结构:

1. 定义:

    一组用来保存一种或者多种特定关系的数据的集合(组织和存储数据)

    1. 程序设计:

        将现实中大量而复杂的问题以特定的数据类型和特定的数据结构存储在内存中,并在此基础上实现某个特定的功能的操作(程序 = 数据结构 + 算法)

        高内聚:一个功能模块只干一件事

        低耦合:功能模块与功能模块之间的耦合度要低

        可读性:程序需要添加注释

        健壮性:程序在运行过程中不能产生异常

    2. MVC软件设计架构:

        M:mode,数据的管理(数据结构)

        V:view,视图,数据的反映及人机交互

        C:ctrl,逻辑控制

2. 数据与数据之间的关系

    1. 数据的逻辑结构:数据元素与元素之间的关系

        集合:关系平等

        线性结构:元素之间一对一的关系(表(数组、链表)),队列,栈)

        树形结构:元素之间一对多的关系(二叉树)

        图形结构:元素之间多对多的关系(网状结构)

    2. 数据的物理结构:数据的逻辑结构在计算机内存中的存储形式

        1. 顺序存储:

            采用一段连续的内存空间保存元素

            优点:数据访问方便

            缺点:1. 数据插入删除需要移动大量的元素

                       2. 需要预分配内存空间

                       3. 容易造成存储空间碎片

        2. 链式存储:

            采用一种非连续的内存空间保存元素

            优点:1. 插入删除数据效率高

                       2. 不需要预分频内存

            缺点:访问元素必须遍历,效率低

        3. 索引存储:

            通过关键字构建索引表,通过索引表来找到数据的存储位置

        4. 散列存储(哈希存储):

            将数据元素的存储位置与关键码之间建立确定对应关系从而实现查找的存储方式

             索引存储和散列存储都是为了提高数据的查找速度

单向链表:

    1. 有头链表:

        第一个链表节点中不存储有效数据

嵌入式学习第十五天!(内存管理、链表)-CSDN博客

    2. 无头链表:

        第一个链表结点中存储有效数据

        1. 定义无头链表的句柄和结点:

#ifndef _LINK_H_
#define _LINK_H_typedef int DATA_TYPE;typedef struct node
{DATA_TYPE data;struct node *pnext;}LINK_NODE;typedef struct list
{LINK_NODE *phead;int curlen;}LINK_LIST;#endif

            说明其中struct node还未定义的时候就用struct node *定义pnext:因为不管是char *还是int *等还是struct node *都是指针类型,它都占8个字节,但是如果不加*,那么系统就不知道结构体构建的内存空间的大小,所以就会报错。

        2. 创建无头链表:

LINK_LIST *Create_Link(void)
{LINK_LIST *plist = malloc(sizeof(LINK_LIST));if(plist == NULL){return NULL;}plist->phead = NULL;plist->curlen = 0;return plist;
}

        3. 头插法:

int Push_Head_Link(LINK_LIST *plist, DATA_TYPE data)
{LINK_NODE *pnode = malloc(sizeof(LINK_NODE));if(pnode == NULL){return -1;}pnode->data = data;pnode->pnext = NULL;pnode->pnext = plist->phead;plist->phead = pnode;plist->curlen++;return 0;
}

        4. 尾插法:

int Push_Tail_Link(LINK_LIST *plist, DATA_TYPE data)
{LINK_NODE *pnode = malloc((sizeof(LINK_NODE)));if(pnode == NULL){return -1;}pnode->data = data;pnode->pnext = NULL;LINK_NODE *ptmp = plist->phead;if(ptmp == NULL){ptmp = pnode;}else{while(ptmp->pnext != NULL){ptmp = ptmp->pnext;}ptmp->pnext = pnode;}plist->curlen++;return 0;
}

        5. 遍历:

int list_for_each(LINK_LIST *plist)
{LINK_NODE *ptmp = plist->phead;while(ptmp != NULL){printf("%d ", ptmp->data);ptmp = ptmp->pnext;}printf("\n");return 0;
}

        6. 尾删法:

int Pop_Tail_Link(LINK_LIST *plist)
{LINK_NODE *ptmp = plist->phead;if(ptmp == NULL){return 0;}else if(ptmp->pnext == NULL){free(ptmp);plist->phead = NULL;}else{while(ptmp->pnext->pnext == NULL){ptmp = ptmp->pnext;}free(ptmp->pnext);ptmp->pnext = NULL;}plist->curlen--;return 0;
}

        7. 头删法:

int Pop_Head_Link(LINK_LIST *plist)
{LINK_NODE *ptmp = plist->phead;if(ptmp == NULL){return 0;}else if(ptmp->pnext == NULL){free(ptmp);plist->phead = NULL;}else{plist->phead = plist->phead->pnext;free(ptmp);}plist->curlen--;return 0;
}

        8. 查找:

LINK_NODE *Find_Link_Node(LINK_LIST *plist, DATA_TYPE data)
{LINK_NODE *ptmp = plist->phead;while(ptmp != NULL){if(ptmp->data == data){return ptmp;}ptmp = ptmp->pnext;}return NULL;
}

        9. 修改:

int Replace_link_data(LINK_LIST *plist, DATA_TYPE olddata, DATA_TYPE newdata)
{LINK_NODE *ptmp = plist->phead;while(ptmp != NULL){if(ptmp->data = olddata){ptmp->data = newdata;}ptmp = ptmp->pnext;}return 0;
}

        10. 销毁:

int Destroy_Link(LINK_LIST *plist)
{LINK_NODE *ptmp = plist->phead;LINK_NODE *pfree = plist->phead;while(ptmp != NULL){ptmp = ptmp->pnext;free(pfree);pfree = ptmp;}free(plist);return 0;
}

            在链表用完以后需要销毁,是为了防止内存泄露(内存空间完全被占用,没有内存可以分配),可以利用valgrind判断是否发生内存泄露。

sudo apt-get install valgrind
valgrind ./a.out

            malloc7次,释放7次,所以并没有发生内存泄露

相关文章:

嵌入式学习第二十九天!(数据结构的概念、单向链表)

数据结构: 1. 定义: 一组用来保存一种或者多种特定关系的数据的集合(组织和存储数据) 1. 程序设计: 将现实中大量而复杂的问题以特定的数据类型和特定的数据结构存储在内存中,并在此基础上实现某个特定的功…...

【ZooKeeper】2、安装

本文基于 Apache ZooKeeper Release 3.7.0 版本书写 作于 2022年3月6日 14:22:11 转载请声明 下载zookeeper安装包 wget https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/zookeeper-3.7.0/apache-zookeeper-3.7.0-bin.tar.gz解压 tar -zxvf apache-zookeeper-3.7.0-b…...

通过Pytest 多数据库连接实例了解Python工厂模式与单例模式的区别

1. 前言 在做自动化测试时,有些特殊项目需要连接不同的数据库进行造数或者断言。自动化框架中,一般使用Pytest yaml 数据驱动的居多,如果一个项目中有上百条数据库相关测试用例,在数据库测试时,如果设计不合理的连接模…...

超拟人语音合成上线,打造有温度的交互新体验

语言使得人类可以构建共同想象的现实,即共同的信念,从而进行大规模团结合作,这是认知革命赋予人类力量的核心。在《人类简史》中,语言被描述成为人类进化的关键力量,而语音的能力是推动语言逐渐进化的火花。 人工智能…...

word 及PPT 中修改公式字体

主要参考: 1.word修改公式默认字体并打出漂亮公式_word 公式 字体-CSDN博客 2.word 使用数学公式字体 在2中 提供的 链接下载字体,或者可以在这里直接下载,下载链接: https://www.lanzoub.com/iNt3g1rs3w0h 密码:a52p 然后按…...

将数据转换成xml格式的文档并下载

现在有一个实体类对象的集合&#xff0c;需要将它们转换为xml文档&#xff0c;xml文档就是标签集合的嵌套&#xff0c;例如一个学生类&#xff0c;有姓名、年龄等&#xff0c;需要转换成一下效果&#xff1a; <student><age>14</age><name>张三</na…...

深入理解与实践AB测试:从理论到实战案例解析

一、引言 在互联网产品优化和运营策略制定中&#xff0c;AB测试&#xff08;也称为分组测试或随机化对照实验&#xff09;是一种科学且严谨的方法。它通过将用户群体随机分配至不同的实验组&#xff08;通常是A组和B组&#xff09;&#xff0c;对比不同版本的产品或策略对关键…...

flask之请求钩子

请求钩子是通过装饰器的形式实现&#xff0c;Flask支持如下四种请求钩子&#xff1a; 1、before_first_request: 在第一次请求处理之前先被执行 2、before_request: 在每次请求前执行 3、after_request: 在每次请求处理之后被执行 接受一个参数&#xff1a;视图函数的响应在…...

COPY requires at least two arguments, docker COPY 报错

COPY requires at least two arguments # 使用 Node.js 12.16.0FROM node:12.16.0WORKDIR /appCOPY ..原因&#xff1a;Dockerfile文件COPY后的两个. 要加空格 本内容来源于小豆包&#xff0c;想要更多内容请跳转小豆包 》...

权限提升-Web权限提升篇划分获取资产服务后台系统数据库管理相互转移

知识点 1、权限提升转移-分类&高低&场景 2、Web权限提升及转移-后台&数据库 3、后台权限及转移-转移对象&后台分类 章节点&#xff1a; 1、Web权限提升及转移 2、系统权限提升及转移 3、宿主权限提升及转移 4、域控权限提升及转移 基础点 0、为什么我们要学…...

【Unity每日一记】unity中的内置宏和条件编译(Unity内置脚本符号)

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;uni…...

发现有一个会Python的男友魅力值杠杠的!!!

Python能做什么&#xff1f; 可以做日常任务&#xff0c;比如自动备份你的MP3&#xff0c;可以做网站&#xff0c;很多著名的网站像知乎、YouTube就是Python写的&#xff0c; 可以做网络游戏的后台&#xff0c;很多在线游戏的后台都是Python开发的。 上面说的这些本人并没有实…...

SQL日期函数

文章目录 1.获取日期时间函数1.1 获取当前日期时间1.2 获取当前日期1.3 获取当前时间 2.日期格式化★★★2.1 日期转指定格式字符串2.2 字符串转日期 3.日期间隔3.1 增加日期间隔 ★★★3.2 减去一个时间间隔★★★3.3 日期相差天数&#xff08;天&#xff09;3.4 相差时间&…...

C语言经典面试题目(二十六)

1、解释一下C语言中的函数原型及其作用。 函数原型是指在函数定义之前声明函数的参数类型、返回类型和函数名称的一种声明方式。函数原型的作用包括&#xff1a; 编译器检查&#xff1a;函数原型能够告诉编译器函数的返回类型和参数类型&#xff0c;从而能够在编译阶段检查函…...

创建一个electron-vite项目

前置条件&#xff1a;非常重要&#xff01;&#xff01;&#xff01; npm: npm create quick-start/electronlatest yarn: yarn create quick-start/electron 然后进入目录&#xff0c;下载包文件&#xff0c;运行项目 到以上步骤&#xff0c;你已经成功运行起来一个 electr…...

Codeforces Round 935 (Div. 3)A~E

A. Setting up Camp 题目分析: 有三种人&#xff0c;内向、外向、综合&#xff0c;内向必须独自一个帐篷&#xff0c;外向必须3个人一个帐篷&#xff0c;综合介于1~3人一个帐篷&#xff0c;我们发现非法情况只会存在外向的人凑不成3个人一个帐篷的情况&#xff0c;因外向不够可…...

ES: spring boot中使用ElasticsearchClient

一、依赖&#xff1a;&#xff08;要根据不同版本的ES来调整依赖,否则会报错&#xff0c;不支持太低版本的ES&#xff0c;比如7.6以下的&#xff09; <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-e…...

实体框架EF(Entity Framework)简介

实体框架EF&#xff08;Entity Framework&#xff09;简介 文章目录 实体框架EF&#xff08;Entity Framework&#xff09;简介一、概述二、O/R Mapping是什么采用O/R Mapping带来哪些好处 三、Entity Framework架构3.1 下图展示了Entity Framework的整体架构3.2 Entity Framew…...

使用CUDA 为Tegra构建OpenCV

返回&#xff1a;OpenCV系列文章目录&#xff08;持续更新中......&#xff09; 上一篇&#xff1a;MultiArch与Ubuntu/Debian 的交叉编译 下一篇&#xff1a;在iOS中安装 警告&#xff1a; 本教程可能包含过时的信息。 使用CUDA for Tegra 的OpenCV 本文档是构建支持 CUD…...

YoloV8改进策略:BackBone改进|PKINet

摘要 PKINet是面向遥感旋转框的主干,网络包含了CAA、PKI等模块,给我们改进卷积结构的模型带来了很多启发。本文,使用PKINet替代YoloV8的主干网络,实现涨点。PKINet是我在作者的模型基础上,重新修改了底层的模块,方便大家轻松移植到YoloV8上。 论文:《Poly Kernel Ince…...

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...

第19节 Node.js Express 框架

Express 是一个为Node.js设计的web开发框架&#xff0c;它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用&#xff0c;和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...

shell脚本--常见案例

1、自动备份文件或目录 2、批量重命名文件 3、查找并删除指定名称的文件&#xff1a; 4、批量删除文件 5、查找并替换文件内容 6、批量创建文件 7、创建文件夹并移动文件 8、在文件夹中查找文件...

C++ Visual Studio 2017厂商给的源码没有.sln文件 易兆微芯片下载工具加开机动画下载。

1.先用Visual Studio 2017打开Yichip YC31xx loader.vcxproj&#xff0c;再用Visual Studio 2022打开。再保侟就有.sln文件了。 易兆微芯片下载工具加开机动画下载 ExtraDownloadFile1Info.\logo.bin|0|0|10D2000|0 MFC应用兼容CMD 在BOOL CYichipYC31xxloaderDlg::OnIni…...

如何在网页里填写 PDF 表格?

有时候&#xff0c;你可能希望用户能在你的网站上填写 PDF 表单。然而&#xff0c;这件事并不简单&#xff0c;因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件&#xff0c;但原生并不支持编辑或填写它们。更糟的是&#xff0c;如果你想收集表单数据&#xff…...

Go 并发编程基础:通道(Channel)的使用

在 Go 中&#xff0c;Channel 是 Goroutine 之间通信的核心机制。它提供了一个线程安全的通信方式&#xff0c;用于在多个 Goroutine 之间传递数据&#xff0c;从而实现高效的并发编程。 本章将介绍 Channel 的基本概念、用法、缓冲、关闭机制以及 select 的使用。 一、Channel…...

在Mathematica中实现Newton-Raphson迭代的收敛时间算法(一般三次多项式)

考察一般的三次多项式&#xff0c;以r为参数&#xff1a; p[z_, r_] : z^3 (r - 1) z - r; roots[r_] : z /. Solve[p[z, r] 0, z]&#xff1b; 此多项式的根为&#xff1a; 尽管看起来这个多项式是特殊的&#xff0c;其实一般的三次多项式都是可以通过线性变换化为这个形式…...

【JVM】Java虚拟机(二)——垃圾回收

目录 一、如何判断对象可以回收 &#xff08;一&#xff09;引用计数法 &#xff08;二&#xff09;可达性分析算法 二、垃圾回收算法 &#xff08;一&#xff09;标记清除 &#xff08;二&#xff09;标记整理 &#xff08;三&#xff09;复制 &#xff08;四&#xff…...

Python+ZeroMQ实战:智能车辆状态监控与模拟模式自动切换

目录 关键点 技术实现1 技术实现2 摘要&#xff1a; 本文将介绍如何利用Python和ZeroMQ消息队列构建一个智能车辆状态监控系统。系统能够根据时间策略自动切换驾驶模式&#xff08;自动驾驶、人工驾驶、远程驾驶、主动安全&#xff09;&#xff0c;并通过实时消息推送更新车…...

解析奥地利 XARION激光超声检测系统:无膜光学麦克风 + 无耦合剂的技术协同优势及多元应用

在工业制造领域&#xff0c;无损检测&#xff08;NDT)的精度与效率直接影响产品质量与生产安全。奥地利 XARION开发的激光超声精密检测系统&#xff0c;以非接触式光学麦克风技术为核心&#xff0c;打破传统检测瓶颈&#xff0c;为半导体、航空航天、汽车制造等行业提供了高灵敏…...