day 18:零基础学嵌入式之数据结构——

一、基础内容

1.数据结构:相互之间存在一种或多种特定关系的数据元素的集合。

2.逻辑结构
(1)集合,所有数据在同一个集合中,关系平等。
(2)线性,数据和数据之间是一对一的关系
(3)树, 一对多
(4)图,多对多

3.物理结构(在内存当中的存储关系)
(1)顺序存储,数据存放在连续的存储单位中。逻辑关系和物理关系一致
(2)链式,数据存放的存储单位是随机或任意的,可以连续也可以不连续。

4.算法:是解决特定问题求解步骤的描述,计算机中表现为指令的有限序列,每条指令表示一个或多个操作。
5.算法的特征
1,输入,输出特性,输入时可选的,输出时必须的。
2,有穷性,执行的步骤会自动结束,不能是死循环,并且每一步是在可以接受的时间内完成。
3,确定性,同一个输入,会得到唯一的输出。
4,可行性,每一个步骤都是可以实现的。

6.算法的设计
(1)正确性,
        1)语法正确
        2)合法的输入能得到合理的结果。
        3)对非法的输入,给出满足要求的规格说明
        4)对精心选择,甚至刁难的测试都能正常运行,结果正确
(2)可读性,便于交流,阅读,理解
(3)健壮性,输入非法数据,能进行相应的处理,而不是产生异常
(4)高效,存储低,效率高 

7.算法时间复杂度:也就是执行这个算法所花时间的度量

8.推导时间复杂度
(1)用常数1 取代运行时间中的所有加法常数
(2)在修改后的运行函数中,只保留最高阶项。
(3)如果最高阶存在且不是1,则取除这个项相乘的常数。

二、线性表

1.定义:零个或者多个数据元素的有限序列;
2.特征

(1)元素之间是有顺序了。如果存在多个元素,第一个元素无前驱,最有一个没有后继,其他的元素只有一个前驱和一个后继。
(2)当线性表元素的个数n(n>=0)定义为线性表的长度,当n=0时,为空表。在非空的表中每个元素都有一个确定的位置,如果a1是第一个元素,那么an就是第n个元素。

3.线性表的常规操作  ADT
typedef struct person {
char name[32];
char sex;
int age;
int score;
}DATATYPE;
typedef int Datatype;
typedef struct list {
DATATYPE *head;
int tlen;
int clen;
}SeqList;

SeqList *CreateSeqList(int len);
int DestroySeqList(SeqList *list);
int ShowSeqList(SeqList *list);
int InsertTailSeqList(SeqList *list, DATATYPE data);
int IsFullSeqList(SeqList *list);
int IsEmptySeqList(SeqList *list);
int InsertPosSeqList(SeqList *list, DATATYPE data, int pos);
int FindSeqList(SeqList *list, char *name);
int ModifySeqList(SeqList *list, char *old, DATATYPE new);
int DeleteSeqList(SeqList *list, char *name);
int ClearSeqList(SeqList *list);

4.手撕上述代码

(1)seqlist.h

#ifndef _SEQLIST_H_
#define _SEQLIST_H_typedef struct	person {char name[32];char sex;int age;int score;
}DATATYPE;
typedef struct list {DATATYPE *head;int tlen;int clen;
}SeqList;SeqList *CreateSeqList(int len);
int DestroySeqList(SeqList *list);
int ShowSeqList(SeqList *list);
int InsertTailSeqList(SeqList *list, DATATYPE* data);
int IsFullSeqList(SeqList *list);
int IsEmptySeqList(SeqList *list);
int InsertPosSeqList(SeqList *list, DATATYPE *data, int pos);
int FindSeqList(SeqList *list, char *name);
int ModifySeqList(SeqList *list, char *old, DATATYPE *newdata);
int DeleteSeqList(SeqList *list, char *name);
int ClearSeqList(SeqList *list);
int GetSizeSeqList(SeqList *list);
DATATYPE * GetItemSeqList(SeqList*list,int ind);
#endif // !1

(2)seqlist.c

#include "seqlist.h"
#include <stdlib.h>
#include <stdio.h>
#include <string.h>SeqList *CreateSeqList(int len)
{SeqList *sl = malloc(sizeof(SeqList));if(NULL == sl){fprintf(stderr,"CreateSeqList malloc error\n");return NULL;}sl->head = malloc(sizeof(DATATYPE)*len);if(NULL == sl->head){fprintf(stderr,"CreateSeqList malloc2 error\n");return NULL;}sl ->tlen = len;sl ->clen = 0;return sl;}int IsFullSeqList(SeqList *list)
{if(NULL == list){fprintf(stderr,"IsFullSeqList paramter erro\n");return  1;  }return list->clen == list->tlen;
}int InsertTailSeqList(SeqList *list, DATATYPE *data)
{if(IsFullSeqList(list)){fprintf(stderr,"seqlist full\n");return 1;}memcpy(&list->head[list->clen],data,sizeof(DATATYPE));list->clen++;return 0;//list->head[list -> clen]= *data;
}
int ShowSeqList(SeqList *list)
{int len = GetSizeSeqList(list);int i;for(i = 0;i<len;++i){printf("%s %c %d %d\n",list->head[i].name,list->head[i].sex,list->head[i].age,list->head[i].score);}
}
int GetSizeSeqList(SeqList *list)
{return list->clen; 
}
int IsEmptySeqList(SeqList *list)
{return 0 == list->clen; 
}
int FindSeqList(SeqList *list, char *name)
{int i=0;int len = GetSizeSeqList(list);for(i=0;i<len;++i){if(0 ==strcmp(list->head[i].name,name)){return i;}}return -1;
}
DATATYPE *GetItemSeqList(SeqList *List,int ind)
{if(NULL ==List){return NULL;}int len = GetSizeSeqList(List);if(ind < 0||ind >=len){return NULL;}return &List->head[ind];
}
int InsertPosSeqList(SeqList *list, DATATYPE *data, int pos)
{if(IsFullSeqList(list)){return 1;}int len = GetSizeSeqList(list);if(pos<0||pos>len){return 1;;}int i=0;for(i = list->clen;i > pos;--i){memcpy(&list->head[i],&list->head[i-1],sizeof(DATATYPE));}memcpy(&list->head[pos], data,sizeof(DATATYPE));list->clen++;return 0;
}
int DeleteSeqList(SeqList *list, char *name)
{if (IsEmptySeqList(list)){return 1;}  int vel=FindSeqList(list,name);int vel=FindSeqList(list,name);if(-1 == vel){return 1;}int i;int len = GetSizeSeqList(list);for(i=vel;i<=list->clen;++i){memcpy(&list->head[i], &list->head[i+1],sizeof(DATATYPE));}list->clen -=1;// list->clen++;return 0;
}
int ClearSeqList(SeqList *list)
{return list->clen = 0;
}
int ModifySeqList(SeqList *list, char *old, DATATYPE *newdeta)
{if (IsEmptySeqList(list)){return 1;}    int vel=FindSeqList(list,old);if(-1 == vel){return 1;}memcpy(&list->head[vel], newdeta, sizeof(DATATYPE));return 0;
}
int DestroySeqList(SeqList *list)
{if(NULL == list){return 1;}free(list->head);free(list);return 0;
}

(3)main.c

#include "seqlist.h"
#include<stdio.h>
int main(int argc,char **argv)
{SeqList *s1 = CreateSeqList(5);DATATYPE data[]={{"zhangsan",'F',20,80},{"san",'M',21,81},{"zhan",'F',41,85},{"gsan",'M',35,82},{"an",'M',22,90},};InsertTailSeqList(s1,&data[0]);InsertTailSeqList(s1,&data[1]);InsertTailSeqList(s1,&data[2]);ShowSeqList(s1);printf("***************shan***\n");DeleteSeqList(s1, "zhangsan");// InsertPosSeqList(s1, &data[2],3);ShowSeqList(s1);// int ret = FindSeqList(s1,"zhangsan");// if(-1 ==ret)// {//     printf("not found");// }// else// {//     DATATYPE *tmp = GetItemSeqList(s1,ret);//     printf("%s %d\n",tmp->name,tmp->score);// }return 0;
}

5.线性表顺序存储的优点,缺点
(1)优点
        1)无需为表中的逻辑关系增加额外的存储空间
        2)可以快速随机访问元素O(1)
(2)缺点
        1)插入,删除元素需要移动元素o(n)
        2)无法动态存储。

三、vs—code的一些操作

(1)表头结果:放数组的状态信息,head:数组名,是指针指向首元素地址;tlen:总长度;clen:当前长度,代表使用的有效长度;

  • sudo:以管理员的
  • ping www.baidu.com:计算机是否联上网
  • 虚拟机快速上网步骤:虚拟机—》配置-网络适配器-选地址转换NAT(windows能上网虚拟机就可以上网)-ifconfig-看ens的名字(一般是33)-sudo vi /etc/network/interfaces-1回车

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

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

相关文章

【SSL证书系列】客户端如何验证https网站服务器发的证书是否由受信任的根证书签发机构签发

客户端验证HTTPS网站证书是否由受信任的根证书颁发机构&#xff08;CA&#xff09;签发&#xff0c;是一个多步骤的过程&#xff0c;涉及证书链验证、信任锚&#xff08;Trust Anchor&#xff09;检查、域名匹配和吊销状态验证等。以下是详细的验证流程&#xff1a; 1. 证书链的…

iOS即时通信的技术要点

iOS即时通信开发的关键技术要点总结&#xff1a; 一、通讯协议选择 Socket通信 基础实现&#xff1a;使用原生BSD Socket或CFNetwork框架&#xff08;复杂&#xff09;&#xff0c;推荐第三方库如CocoaAsyncSocket&#xff08;封装GCDAsyncSocket&#xff09;&#xff0c;简化T…

智能AI构建工地安全网:跌倒、抽搐、区域入侵多场景覆盖

智能AI在工地安全中的应用&#xff1a;从监测到救援的全流程实践 一、背景&#xff1a;高温作业下的工地安全挑战 随着夏季高温持续&#xff0c;工地户外作业环境面临严峻考验。工人因高温疲劳、脱水或突发疾病引发的行为异常&#xff08;如晕厥、抽搐、跌倒&#xff09;频发…

Doris

Apache Doris&#xff08;原名&#xff1a;Palo&#xff09;是一个高性能、实时的MPP分析型数据库&#xff0c;非常适合海量数据的即席查询、报表分析、指标统计等 OLAP 场景。Doris 的设计目标是&#xff1a;极致查询性能、简单易用、支持高并发分析和明细查询。 一、Doris 核…

# 2-STM32F103-复位和时钟控制RCC

STM32-复位和时钟控制RCC 2-STM32-复位和时钟控制RCC摘要说明本文参考资料如下&#xff1a; 一、STM32最小系统回顾STM32F103C8T6核心板原理图 二、复位三、时钟3.1 时钟树3.2 STM32启动过程3.2 SystemInit()函数3.2.1 SystemInit()第1句&#xff1a;3.2.2 SystemInit()第2句&a…

rk3576 gstreamer opencv

安装gstreamer rk3588使用gstreamer推流_rk3588 gstreamer-CSDN博客 rk3588使用gstreamer推流_rk3588 gstreamer-CSDN博客 Installing on Linux sudo apt-get install libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev libgstreamer-plugins-bad1.0-dev gstreamer1.0-pl…

Quic如何实现udp可靠传输

QUIC&#xff08;Quick UDP Internet Connections&#xff09;是由 Google 设计并被 IETF 标准化的传输层协议&#xff0c;它基于 UDP 实现&#xff0c;但提供了类似 TCP 的可靠性和更高级的功能&#xff08;如多路复用、0-RTT 握手、TLS 加密等&#xff09;。 尽管 UDP 是不可…

uniapp-商城-59-后台 新增商品(属性的选中,进行过滤展示,filter,some,every和map)

前面讲了属性的添加&#xff0c;添加完成后&#xff0c;数据库中已经存在数据了&#xff0c;这时再继续商品的添加时&#xff0c;就可以进行属性的选择了。 在商品添加过程中&#xff0c;属性选择是一个关键步骤。首先&#xff0c;界面需要展示嵌套的属性数据&#xff0c;用户通…

负载均衡 ELB 在 zkmall开源商城高流量场景下的算法优化

在电商大促、直播带货等高频交易场景下&#xff0c;流量突发增长对系统稳定性提出严峻挑战。ZKmll 开源商城通过对负载均衡 ELB&#xff08;Elastic Load Balancer&#xff09;算法的深度优化&#xff0c;结合业务场景特性设计动态加权轮询 地域感知 热点分流的混合策略&…

Linux干货(三)

前言 从B站黑马程序员Linux课程摘选的学习干货&#xff0c;新手友好&#xff01;若有侵权&#xff0c;会第一时间处理。 目录 前言 1.which find命令 1.which命令 2.find命令 2.grep wc 管道符 1.grep命令 2.wc命令 3.管道符 3.echo tail 重定向符 1.echo命令 2.反…

Sigmoid与Softmax:从二分类到多分类的深度解析

Sigmoid与Softmax:从二分类到多分类的深度解析 联系 函数性质:二者都是非线性函数 ,也都是指数归一化函数,可将输入值映射为0到1之间的实数 ,都能把输出转化成概率分布的形式,在神经网络中常作为激活函数使用。Softmax是Sigmoid的推广:从功能角度看,Softmax函数可视为…

文件系统交互实现

关于之前的搭建看QT控件文件系统的实现-CSDN博客&#xff0c;接下来是对本程序的功能完善&#xff0c;我想着是这样设计的&#xff0c;打开一个目录以后&#xff0c;鼠标选中一个项可以是目录&#xff0c;也可以是文件&#xff0c;右键可以出现一个菜单选择操作&#xff0c;比如…

[ctfshow web入门] web75

信息收集 启用了open_basedir&#xff0c;所以之前的方法又不能用了 解题 cforeach(new DirectoryIterator("glob:///*") as $a){echo($a->__toString(). ); } ob_flush();cif ( $a opendir("glob:///*") ) {while ( ($file readdir($a)) ! false …

Vulfocus靶场-文件上传-3

WSO2 文件上传 &#xff08;CVE-2022-29464&#xff09; WSO2是一家成立于 2005 年的开源技术提供商。它提供了一个企业平台&#xff0c;用于在本地和整个 Internet 上 集成应用程序编程接口(API)、应用程序和 Web 服务。 某些 WSO2 产品允许无限制的文件上传和远程代码执行。…

基于MCP的桥梁设计规范智能解析与校审系统构建实践

引言 今天本文准备盘一个大活&#xff0c;聊一聊偏特定行业一点的AI技术深入应用思考及实践。 一、传统设计行业项目背景与行业痛点 在桥梁设计领域&#xff0c;标准规范是设计的基础&#xff0c;直接关系到桥梁结构的安全性、耐久性和经济性。然而&#xff0c;传统的规范应…

远程连接电脑的方法?异地远程桌面连接和三方软件实现

远程连接电脑&#xff0c;是指通过网络技术&#xff0c;在一台设备上操控另一台设备的电脑桌面&#xff0c;实现跨地域的操作和管理。在日常工作、技术支持、远程办公等场景中&#xff0c;远程连接电脑都发挥着重要作用。实现远程连接电脑主要有系统自带工具和第三方软件两种方…

win11 安装 wsl ubuntu 18.04后换源失败!

记录几个问题是如何解决的。 一 下载wsl后&#xff0c;有报错&#xff1a; Installing, this may take a few minutes... WslRegisterDistribution failed with error: 0x8007019e Error: 0x8007019e ??????? Linux ? Windows ???? Press any key to continue... …

PY32系列单片机离线烧录器,可配置选项字节和上机台批量烧录

PY32离线烧录器采用 MINI-USB 接口&#xff0c;提供稳定的物理连接。设备与电脑采用串口方式通讯&#xff0c;波特率固定为 1M。需配合我们的上位机使用。PY32离线烧录器现支持芯片型号在PY32F002A/002B/002/003/030/071/072/040/403/303各封装和XL32F001/003。烧录器仅提供 3.…

深入理解 this 指向与作用域解析

引言 JavaScript 中的 this 关键字的灵活性既是强大特性也是常见困惑源。理解 this 的行为对于编写可维护的代码至关重要&#xff0c;但其动态特性也会让我们感到困惑。 与大多数编程语言不同&#xff0c;JavaScript 的 this 不指向函数本身&#xff0c;也不指向函数的词法作…

# IntelliJ IDEA企业版开发入门:包、类与项目结构详解

--- ## 一、项目结构与包的概念 ### 1. 标准项目目录解析 在IntelliJ IDEA中&#xff0c;一个Java项目通常包含以下核心目录&#xff1a; - **src**&#xff1a;源代码根目录。 - **main**&#xff1a;主代码目录&#xff0c;存放业务逻辑代码。 - **java**&#xff1a;Java…