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

数据结构:

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次,所以并没有发生内存泄露

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

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

相关文章

安装调试kotti_ai:AI+互联网企业级部署应用软件包@riscv+OpenKylin

先上结论:riscvOpenKylin可以安装pyramidkottikotti_ai 但是paddle_serving_client无法安装,项目的AI实现部分需要改用其它方法,比如onnx。最终onnx也没有装成,只好用飞桨自己的推理。 安装kotti pip install kotti 安装kotti和…

postman测试文件上传接口

java里编写一个导入接口,接口的入参就是一个文件,此时接口中使用的接收参数是 用postman测试这个接口时:Body里选择类型是form-data Header中自动修改了Content-Type 如果既要上传文件,又要输入参数可使用如下方式: 此…

训练svm并部署树莓派

训练svm并部署树莓派 开发环境1. 准备数据集2. 训练模型3. 部署模型开发环境 vscode python 3.8 用到的库: scikit-learn==1.3.2 pickle torch pandas matplotlib 1. 准备数据集 数据为xls文件,如下格式 2. 训练模型 文件结构 执行训练 python代码 import pickle &…

递归和递推的区别

目录 1、递推 2、递归 3、结言 递归 递推 1、递推 递推就是说从初值出发后一直运算到所需的结果。 ——从已知到未知。(从小到大) 举一个简单的例子: 每天能学习一个小时的编程,那么一个月之后可以学到三十小时的编程知识。…

vue项目突然报错 error Insert `⏎·········` prettier/prettier

vs设置了保存时自动格式化代码,突然就报错: 解决方法,在.eslintrc.js最后添加一行:prettier/prettier: off, 然后重新运行

C#多态性

文章目录 C#多态性静态多态性函数重载函数重载 动态多态性运行结果 C#多态性 静态多态性 在编译时,函数和对象的连接机制被称为早期绑定,也被称为静态绑定。C# 提供了两种技术来实现静态多态性。分别为: 函数重载 运算符重载 运算符重载将…

UnityShader(十九) AlphaBlend

上代码: Shader "Shader入门/透明度效果/AlphaBlendShader" {Properties{_MainTex ("Texture", 2D) "white" {}_AlphaScale("AlphaScale",Range(0,1))1.0}SubShader{Tags { "RenderType""Transparent&quo…

视频转音频怎么转? 5个详细的方法~

将视频中的音频提取为音频文件,不仅可以帮助我们在学习和教育环境中使用,例如在听力练习、语言学习或课堂教学中,还可以帮助我们创建音频片段、音乐或声音效果。下面就向大家从5个不同的角度:软件、在线网站、视频剪辑工具、命令工…

【深度学习基础知识】IOU、GIOU、DIOU、CIOU

这里简单记录下IOU及其衍生公式。   为了拉通IOU及其衍生版的公式对比,以及方便记忆,这里用一个统一的图示来表示出所有的参数 【A】目标框的区域【B】预测框的区域【C】A与B的交集【&#xff…

docker安装Milvus

docker安装Milvus 拉去CPU版本的milvus镜像 $ sudo docker pull milvusdb/milvus:0.10.0-cpu-d061620-5f3c00 docker pull milvusdb/milvus:0.10.0-cpu-d061620-5f3c00 mkdir -p milvus/conf cd milvus/conf ls wget https://raw.githubusercontent.com/milvus-io/milvus/v0.1…

springboot项目yml文件中${}的使用

作用 项目启动时可以灵活的通过修改环境变量来替换配置中的值,如果没有传该环境变量时,就是用默认值; 格式:${自定义参数名:默认值} 代码举例,已开启应用的端口号为例: server: port: ${SERVER_PORT:9…

PC1000A双通道高精度线性恒流LED控制芯片,只需极少极少外围元件

概述 PCD1000A 是一款线性恒流 IC,输出电流可调,恒流精度高,应用方案简单,成本和阻容降压相当,具有过温保护功能,更安全,更可靠。 特点 输出电流可调 5mA-60mA, 恒 流精度可以达…

【Python爬虫】网络爬虫:信息获取与合规应用

这里写目录标题 前言网络爬虫的工作原理网络爬虫的应用领域网络爬虫的技术挑战网络爬虫的伦理问题结语福利 前言 网络爬虫,又称网络爬虫、网络蜘蛛、网络机器人等,是一种按照一定的规则自动地获取万维网信息的程序或者脚本。它可以根据一定的策略自动地浏…

OpenLayers基础教程——使用WebGL加载海量数据(1)

1、前言 最近遇到一个问题:如何在OpenLayers中高效加载海量的场强点?由于项目中的一些要求,不能使用聚合的方法加载。一番搜索之后发现:OpenLayers中有一个WebGLPoints类,使用该类可以轻松应对几十万的数据量&#xf…

【链表】Leetcode 25. K 个一组翻转链表【困难】

K 个一组翻转链表 给你链表的头节点 head ,每 k 个节点一组进行翻转,请你返回修改后的链表。k 是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。你不能只是单纯的改…

【python_往企业微信群中发送文件】

python_往企业微信群中发送文件 这个是用企业微信群机器人的功能,没有用到后台应用。群机器人 #-*- coding:utf-8-* import requests#类型:voice,file file_type"file" file_path"D:\desktop\不过.jpg" webhookkey"xxxx"#…

Mysql与MyBatis

1 Sql语句 增删改查 1.1 建表 -- cmd展示数据库 show databases ; -- cmd登录数据库 mysql localhost -u root -p-- auto_increment 自动增长,每添加一个表项id自动增1 -- char定长字符串 0-255,不足十个字符按十个字符算, varchar变长字符串…

【机器学习】基于蝴蝶算法优化的BP神经网络分类预测(BOA-BP)

目录 1.原理与思路2.设计与实现3.结果预测4.代码获取 1.原理与思路 【智能算法应用】智能算法优化BP神经网络思路【智能算法】蝴蝶优化算法(BOA)原理及实现 2.设计与实现 数据集: 数据集样本总数2000 多输入多输出:样本特征24&#xff0c…

绝地求生:今天来聊聊PUBG外挂

最近关于外挂和封禁的贴子一下子多了起来,也看到了很多不一样的说法和观点,也有一些常识性的问题被反复提及。作为一个刚刚及格的计算机专业同学,闲游盒尝试用大白话的方式,和大家分享下就以下问题我的观点: 1. 外挂是…

五、初识Django

初识Django 1.安装django2.创建项目2.1第一种方式:在终端2.2第二种方式:Pycharm 3.创建app4.快速上手4.1再写一个页面4.2templates模板4.3静态文件4.3.1static目录4.3.2引用静态文件 5.模板语法案例:伪联通新闻中心6.请求和相应案例&#xff…