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

数据结构与算法整理复习(一):数据结构概念与线性表

目录

第一章:绪论

1.1 数据结构的基本概念

1.2 算法与算法评价

第二章:线性表

2.1 线性表的定义和基本操作

2.2 线性表的顺序表示(顺序表)

 应用题

2.3 线性表的链式表达(链表)

2.3.1 单链表

2.3.2 双链表

 2.3.3 循环链表

2.3.4 静态链表

2.3.5 顺序表与链表的比较 


第一章:绪论

1.1 数据结构的基本概念

可以用“抽象数据类型(ADT)”定义一个完整的数据结构

抽象数据类型(ADT)为一个数学模型以及其定义在数学模型上的一组操作。包含(数据对象、数据关系、以及其基本操作集),故为一个完整的数据结构。

数据的逻辑结构独立于存储结构,但数据的存储结构不能独立于其逻辑结构

1.2 算法与算法评价

好算法应该达到的目标:正确性、可读性、健壮性、高效率与低存储要求。

空间复杂度O(1):辅助空间的大小与问题规模n无关

时间复杂度O(n^2):执行时间与n^2成正比。

for(int i=0;i<n;i++){for(int j=0;j<m;j++){printf("111");}
}

上诉代码是时间复杂度为O(nm)。

#include <stdio.h>// 递推方式求解斐波那契数列
long long fibonacci_iterative(int n) {if (n <= 0) return 0;if (n == 1) return 1;long long a = 0, b = 1, c;for (int i = 2; i <= n; i++) {c = a + b;a = b;b = c;}return b;
}// 递归方式求解斐波那契数列
long long fibonacci_recursive(int n) {if (n <= 0) return 0;if (n == 1) return 1;return fibonacci_recursive(n - 1) + fibonacci_recursive(n - 2);
}int main() {int n;printf("请输入一个非负整数: ");scanf("%d", &n);printf("斐波那契数列第%d项是: %lld\n", n, fibonacci_iterative(n));printf("斐波那契数列第%d项是: %lld\n", n, fibonacci_recursive(n));return 0;
}

第二章:线性表

2.1 线性表的定义和基本操作

每一个元素有且只有一个前驱和后继。

线性表的特性:

  • 表中元素个数有限
  • 元素具有逻辑上的顺序性,有先后顺序
  • 表中元素都是你数据元素,每个数据元素可以包含多个数据项
  • 表中元素的数据类型都相同(每个元素占相同大小的空间)
  • 元素具有抽象性
InitList(List &L)//初始化表
Length(List L)//求表长
LocateElem(List L,ElemType e)//按值查找,返回位序
GetElem(List L,int i)//按位查找
ListInsert(List &L,int i, ElemType e)//插入操作,在表L的第i位序插入元素e
ListDelete(List &L,int i,ElemType &e)//删除第i位序的元素,并用e返回删除元素
PrintList(List L)//输出操作
Empty(List L)//判空操作
DestroyList(List &L)//销毁线性表

2.2 线性表的顺序表示(顺序表)

逻辑顺序与其物理顺序相同

顺序表的任意一个数据元素都可以随机存取。

顺序存储结构是一种随机存取的存储结构。

优点:

  • 支持随机访问O(1)
  • 存储密度高

缺点:

  • 元素的插入(平均需要n/2次操作)和删除(平均需要(n-1)/2次操作)需要移动大量元素
  • 分配需要一段连续的存储空间,灵活性较差

静态分配顺序表代码如下:

#define MAX_SIZE 100//静态顺序表定义
typedef struct{int data[MAX_SIZE];int length;
}SqList;//线性表初始化
InitList(SqList &L){for(int i=0;i<L.length;i++){L.data[i]=0;}L.length = 0;
}//插入操作
bool ListInsert(SqList &L, int i, int e){if(i<1||i>L.length+1) return false;if(L.length >= MAX_SIZE) return flasefor(int j = L.length;j>=i;j--){L.data[j] = L.data[j-1];}L.data[i-1] = e;L.length++;return true;
}
//静态线性表删除操作
bool ListDelete(SqList &L, int i,int &e){if(i<1||i>L.length) return false;if(L.length<=0) return false;e = L.data[i-1]for(int j=i;j<L.length;j++){L.data[j-1]=L.data[j];}L.length--;return true;
}
//按值查找
int LocateElem(SqList L, int e){for(int i=0;i<L.length;i++){if(L.data[i]==e){return i+1;//返回位序}}return -1;//查找失败
}

动态分配顺序表代码如下:

//动态顺序表定义
typedef struct{int *data;int length;int max_size;
}SqList;//线性表初始化
InitList(SqList &L){L.data = (int *)malloc(sizeof(int)*INIT_SIZE)L.length = 0;L.max_size = INIT_SIZE;
}
//线性表插入
bool ListInsert(SqList &L,int i, int e){if(i<1||i>L.length+1) return false;if(L.length>=L.max_size) return false;for(int j=L.length;j>=i;j--){L.data[j] = L.data[j-1];}L.data[i-1] = e;L.length++;return true;
}
//动态线性表删除操作
bool ListDelete(SqList &L, int i,int &e){if(i<1||i>L.length) return false;if(L.length<=0) return false;e = L.data[i-1]for(int j=i;j<L.length;j++){L.data[j-1]=L.data[j];}L.length--;return true;
}
//按值查找
int LocateElem(SqList L, int e){for(int i=0;i<L.length;i++){if(L.data[i]==e){return i+1;//返回位序}}return -1;//查找失败
}

 应用题

1. 原地逆置顺序表

void function(SqList &L){int temp;for(int i=0;i<L.length/2;i++){temp = L.data[i];L.data[i] = L.data[L.length-1-i];L.data[L.length-1-i] = L.data[i];}
}

2.删除所有值为e的元素,要求时间复杂度为O(n),空间复杂度为O(1)

void function(SqList &L, int e){int pos = 0;for(int i=0;i<L.length;i++){if(L.data[i] != e){L.data[pos] = e;pos++;}}L.length = pos;
}

3. 有序顺序表中删除所有值重复的元素

bool function(SqList &L){if(L.length < 1) return false;int i=0;int j=1;for(j;j<L.length;j++){if(L.data[j]==L.data[i]) continue;i++;L.data[i] = L.data[j];}L.length = i+1;return true;
}

4. merge两个有序顺序表,并返回新的表

SqList mergeList(SqList L1, SqList L2, SqList &result){if(L1.length + L2.length > result.maxsize) return false;int i_L1 = 0,i_L2 = 0;int pos = 0;while(i_L1<L1.length && i_L2<L2.length){if(L1.data[i_L1]<=L2.data[i_L2]){result[pos] = L1.data[i_L1];pos++;i_L1++;}result[pos] = L2.data[i_L2];pos++;i_L2++;}while(i_L1<L1.length){result[pos] = L1.data[i_L1];pos++;i_L1++;}while(i_L2<L2.length){result[pos] = L2.data[i_L2];pos++;i_L2++;}result.length = pos;return result;
}

5. 顺序表循环左移p个单位

void reserve(SqList &L, int start, int end){int temp;for(int i = 0;i <= (start-end)/2; i++){temp = L.data[start + i];L.data[start + i] = L.data[end - i];L.data[end - i] = temp;}
}
void function(SqList &L, int p){reserve(L, 0, p-1);reserve(L, p, L.length-1);reserve(L, 0, L.length-1);
}

6. 求两个等长的升序顺序表L1、L2的并集的中位数

void fucntion(SqList L1, SqList L2){int mid_L1 = L1.data[L1.length/2];int mid_L2 = L2.data[L2.length/2];}

2.3 线性表的链式表达(链表)

2.3.1 单链表

定义与初始化

//单链表的定义
typedef struct LNode{ElemType data;LNode *next;
}LNode, *LinkList;//带头节点的初始化(仅需要初始化头节点)
bool InitList(LinkList &L){L = (LNode *)malloc(sizeof(LNode));L->next = NULL;return true;
}//不带头节点的初始化(仅需设定为NULL)
bool InitList(LinkList &L){L = NULL;return true;
}

单链表的相关操作 

//获取单链表长度
int Length(LinkList L){int length = 0;LNode *temp = L;while(temp->next != NULL){length++;temp = temp->next;}return length;//带头节点return length+1;//不带头节点
}//按位序号查找节点(带头节点)
LNode* GetElem(LinkList L, int i){if(i<1) return false;int pos = 0;LNode* temp = L;while(pos<i || temp->next!=NULL){pos++;temp = temp->next;}if(pos == i) return temp;return NULL;
}//按值查找节点(带头节点)
LNode* GetElem(LinkList L, ElemType e){LNode* temp = L->next;while(temp->data != e && temp!=NULL){temp = temp->next;}return temp;
}//在第i位序插入元素e
bool ListInsert(LinkList &L, int i, ElemType e){if(i<1) return false;int pos = 0;LNode* p = L;while(pos<i-1 && p!=NULL){pos++;p = p->next;}if(p == NULL) return false;LNode* temp = (LNode *)malloc(sizeof(LNode*));temp->data = e;temp->next = p->next;p->next = temp;
}//删除位序为i的元素并用e返回被删除元素的值
bool ListDelete(LinkList &L, int i, ElemType* e){int pos = 0;LNode* p = L;while(pos < i-1 && p != NULL){pos++;p = p->next;}if(p==NULL || p->next == NULL) return false;e = p->next->data;LNode* temp = p->next;p->next = temp->next;free(temp);return true;
}//头插法建立链表
LinkList ListHeadInsert(LinkList &L){if(L==NULL){L = (LNode*)malloc(sizeof(LNode*));//初始化头节点L->next = NULL;}int x;scanf("%d", &x)while(x!=999){LNode* p = (LNode *)malloc(sizeof(LNode*));p->data = x;p->next = L->next;L->next = p;scanf("%d", &x)}return L;
}//尾插法建立链表
LinkList ListHeadInsert(LinkList &L){if(L==NULL){L = (LNode*)malloc(sizeof(LNode*));//初始化头节点L->next = NULL;}LNode* p = L;int x;scanf("%d", &x)while(x!=999){LNode* temp = (LNode *)malloc(sizeof(LNode*));temp->data = x;p->next = temp;p = temp;scanf("%d", &x)}p->next = NULL;//注意!return L;
}

2.3.2 双链表

定义与初始化

//双链表定义
typedef struct DNode{struct DNode* prior;struct DNode* next;ElemType data;
}DNode, *DLinkList;//双链表初始化
void InitList(DLinkList &L){L = (DNode*)malloc(sizeof(DNode));L->prior = NULL;L->next = NULL;
}

双链表的操作 

//双链表的后继插入
bool ListInster_after(DLinkList &L, int i, ElemType e){if(i<1 || L==NULL) return false;DNode *p = L;int pos = 0;while(pos < i-1 && p!=NULL){p = p->next;pos++;}if(p == NULL) return false;DNode* temp = (DNode*)malloc(sizeof(DNode*));temp->data = e;temp->prior = p;temp->next = p->next;if(p->next != NULL){p->next->prior = temp;}p->next = temp;return true;
}//双链表的删除操作
bool ListDelete(DLinkList &L, int i){if(i<1 || L==NULL) return false;DNode *p = L;int pos = 0;while(pos < i && p!=NULL){p = p->next;pos++;}if(p == NULL) return false;p->prior->next = p->next;if(p->next!=NULL) p->next->prior = p->prior;free(p);
}

 2.3.3 循环链表

循环链表的定义与初始化

//单循环链表的定义
typedef struct LNode{struct LNode* next;ElemType data;
}LNode, *LinkList;//双循环链表的定义
typedef struct DNode{struct LNode *next, *prior;ElemType data;
}DNode, *DLinklist;//单循环链表的初始化
void InitList(LinkList &L){L = (LNode*)malloc(sizeof(LNode));if(L==NULL) return false;L->next = L;
}//双循环链表的初始化
void InitList(DLinkList &L){L = (DNode*)malloc(sizeof(DNode));if(L==NULL) return false;L->next = L;L->prior = L;
}

 循环链表的操作

//判断是否为空
bool Empty(LinkList L){return L->next == L;
}//判断是否为尾节点
bool is_Tail(LinkList L, LNode *p){return p->next == L;
}//插入和删除和之前一样,但是不需要进行边界的判空操作!

2.3.4 静态链表

2.3.5 顺序表与链表的比较 

逻辑结构:均为线性结构

存储结构:

顺序表为顺序存储,链表为链式存储

顺序表:

  • 优点:支持随机存储、存储密度高;
  • 缺点:大片连续空间分配不方便、且改变容量不方便

链表:

  • 优点:离散的小空间,分配方便,改变容量方便
  • 缺点:不可随机存取,存储密度低

操作方式:

  • 按值查找:顺序表无序时,时间复杂度为O(n);顺序表有序时,时间复杂度为O(logn);链表始终为O(n)。
  • 按位查找:顺序表为O(1),链表为O(n)。
  • 插入和删除:顺序表和链表均为O(n),但是链表比顺序表快得多。(顺序表需要移动大量数据)

评价两种数据结构的方式:

  1. 存储结构
  2. 逻辑结构
  3. 对应的相关运算效率比较
  4. 得出结论……

注意 

  •  链表节点内的存储单元地址为连续的
  • 建立一个有序单链表的最低时间复杂度为O(nlogn)(数组排序最快为O(nlogn),排序后建立链表为O(n),综上为O(nlogn))
  • 需要分配大量空间,且删除和插入无需移动元素的线性表为:静态链表

相关文章:

数据结构与算法整理复习(一):数据结构概念与线性表

目录 第一章&#xff1a;绪论 1.1 数据结构的基本概念 1.2 算法与算法评价 第二章&#xff1a;线性表 2.1 线性表的定义和基本操作 2.2 线性表的顺序表示&#xff08;顺序表&#xff09; 应用题 2.3 线性表的链式表达&#xff08;链表&#xff09; 2.3.1 单链表 2.3.2…...

【Block总结】PConv风车卷积,更大的感受野,提高特征提取能力|即插即用

论文信息 论文标题&#xff1a;《Pinwheel-shaped Convolution and Scale-based Dynamic Loss for Infrared Small Target Detection》 论文链接&#xff1a;https://arxiv.org/pdf/2412.16986 GitHub链接&#xff1a;https://github.com/JN-Yang/PConv-SDloss-Data 创新点 …...

Python新春烟花

目录 系列文章 写在前面 技术需求 完整代码 下载代码 代码分析 1. 程序初始化与显示设置 2. 烟花类 (Firework) 3. 粒子类 (Particle) 4. 痕迹类 (Trail) 5. 烟花更新与显示 6. 主函数 (fire) 7. 游戏循环 8. 总结 注意事项 写在后面 系列文章 序号直达链接爱…...

VirtualBox can‘t enable the AMD-V extension

个人博客地址&#xff1a;VirtualBox cant enable the AMD-V extension | 一张假钞的真实世界 最近一次完成Deepin的系统更新后&#xff0c;进入VirtualBox创建的虚拟机&#xff08;Widows10&#xff09;时&#xff0c;出现以下错误&#xff1a; 根据网址“https://askubuntu.…...

掘金--创意标题匹配问题

问题描述 在广告平台中&#xff0c;为了给广告主一定的自由性和效率&#xff0c;允许广告主在创造标题的时候以通配符的方式进行创意提交。线上服务的时候&#xff0c;会根据用户的搜索词触发的 bidword 对创意中的通配符&#xff08;通配符是用成对 {} 括起来的字符串&#x…...

OBU和T-Box

OBU&#xff08;On-Board Unit&#xff0c;车载单元&#xff09;和T-Box&#xff08;Telematics Box&#xff0c;远程信息处理控制单元&#xff09;都是用于车联网和智能交通系统的车载设备&#xff0c;但它们的功能、应用场景和技术特点存在显著差异。以下是两者的详细对比&am…...

【PVE】Proxmox VE8.0+创建LXC容器安装docker

为了不影响PVE宿主机&#xff0c;通常使用套娃的形式安装Docker容器&#xff0c;再安装相关docker应用。首先在CT模板中创建 Linux 容器&#xff0c;推荐使用Debian。开启ssh登录&#xff0c;修改debian配置&#xff0c;安装docker 一、创建 LXC 容器 1、CT模板下载 点击“模…...

一文大白话讲清楚webpack基本使用——11——chunkIds和runtimeChunk

文章目录 一文大白话讲清楚webpack基本使用——11——chunkIds和runtimeChunk1. 建议按文章顺序从头看&#xff0c;一看到底&#xff0c;豁然开朗2. 啥是chunkIds3.怎么使用chunkIds4. 啥是runtimeChunk5. 怎么使用runtimeChunk 一文大白话讲清楚webpack基本使用——11——chun…...

Java 中的设计模式:经典与现代实践

Java 中的设计模式&#xff1a;经典与现代实践 1. 设计模式简介 设计模式是一种软件开发中的思想&#xff0c;它为我们提供了一些经过验证的、能够应对常见问题的解决方案。学习和掌握设计模式能够让开发者在面对复杂的需求时&#xff0c;能够设计出更加灵活、可维护的代码。…...

DRG_DIP 2.0时代医院程序结构转型与数据结构优化研究

一、引言 1.1 DRG_DIP 2.0 改革背景与意义 医保支付方式改革在医疗保障制度改革中占据着极为关键的地位&#xff0c;是推动医疗领域变革的核心力量。它犹如一把精准的手术刀&#xff0c;对医疗资源的合理分配、医疗服务质量的稳步提升以及医疗费用的有效控制起着决定性作用。…...

一部手机如何配置内网电脑同时访问内外网

做过运维的朋友都知道&#xff0c;最麻烦的是运维电脑不能远程&#xff0c;每次都得现场进行维护&#xff0c;明明客户那边有可以访问内网的电脑&#xff0c;怎么操作能将这台电脑能访问跟到外网呢&#xff0c;这样不就能通过远程软件远程了吗&#xff1f;嘿嘿。按以下步骤试试…...

国产低功耗带LCD驱动和触摸按键功能的MCU

以下是国产低功耗、集成LCD驱动和触摸按键功能的MCU精选型号及其核心特性&#xff0c;结合性能、功耗和适用场景进行综合推荐&#xff1a; 1.灵动微MM32L0130系列 257 核心特性&#xff1a;低功耗&#xff1a;待机模式功耗低至100nA&#xff0c;支持多种低功耗模式。 LCD驱动&a…...

XCP 协议基础

文章目录 一、XCP 简介二、XCP的主要功能三、什么是标定四、什么时候进行标定五、标定的意义六、标定的三层架构XCP协议 和 CCP协议的区别参考 一、XCP 简介 XCP 协议的全称为 eXtended Calibration Protocol&#xff0c;即扩展标定协议。 另有其他定义&#xff0c;XCP 协议全…...

Swift 中 Codable 和 Hashable 的理解

最近初学Swift&#xff0c;碰到下面的代码脑袋里冒出疑问&#xff1a;Codable 和 Hashable是啥&#xff1f;怎么理解&#xff1f; struct Landmark: Hashable, Codable {var id: Intvar name: Stringvar park: Stringvar state: Stringvar description: String }针对上面的疑问…...

基于 WPF 平台实现成语游戏

一、引言 在软件开发领域&#xff0c;利用各种框架开发有趣的应用程序是提升技术能力和增加开发乐趣的有效方式。WPF&#xff08;Windows Presentation Foundation&#xff09;作为微软强大的桌面应用开发框架&#xff0c;提供了丰富的图形和交互功能。本文将带领大家基于 WPF…...

2024“博客之星”——我的博客成长与技术洞察

&#x1f31f;欢迎来到 我的博客 —— 探索技术的无限可能&#xff01; &#x1f31f;博客的简介&#xff08;文章目录&#xff09; 目录 一、引言二、个人成长与突破盘点&#xff08;一&#xff09;技能提升与知识拓展&#xff08;二&#xff09;创作风格与影响力提升&#xf…...

HTTPS协议简述

HTTPS 协议简介 HTTPS 是 HTTP Security 的组合&#xff0c;即在 HTTP 的基础上加入了安全性机制&#xff0c;主要通过加密传输、身份认证和数据完整性保护来确保通信的安全性。 为了实现这一目标&#xff0c;HTTPS 引入了 加密技术&#xff0c;包括对称加密、非对称加密和数…...

前沿技术趋势洞察:2024年技术的崭新篇章与未来走向!

引言 时光飞逝&#xff0c;2024年已经来临&#xff0c;回顾过去一年&#xff0c;科技的迅猛进步简直让人目不暇接。 在人工智能&#xff08;AI&#xff09;越来越强大的今天&#xff0c;我们不再停留在幻想阶段&#xff0c;量子计算的雏形开始展示它的无穷潜力&#xff0c;Web …...

HTML常用属性

HTML标签的常见属性包括许多不同的功能&#xff0c;可以为元素提供附加信息或控制元素的行为。以下是一些常见的属性及其解释&#xff1a; 1. src 描述&#xff1a;src&#xff08;source&#xff09;属性指定一个资源的路径&#xff0c;通常用于图像、音频、视频等标签。常见…...

电子应用设计方案100:智能家庭AI电风扇系统设计

智能家庭 AI 电风扇系统设计 一、引言 智能家庭 AI 电风扇系统旨在为用户提供更加舒适、便捷和个性化的吹风体验&#xff0c;通过融合人工智能技术和先进的控制算法&#xff0c;实现智能化的风速调节、风向控制和场景适应。 二、系统概述 1. 系统目标 - 实现精准的风速调节&a…...

RocketMQ延迟消息机制

两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数&#xff0c;对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后&#xf…...

阿里云ACP云计算备考笔记 (5)——弹性伸缩

目录 第一章 概述 第二章 弹性伸缩简介 1、弹性伸缩 2、垂直伸缩 3、优势 4、应用场景 ① 无规律的业务量波动 ② 有规律的业务量波动 ③ 无明显业务量波动 ④ 混合型业务 ⑤ 消息通知 ⑥ 生命周期挂钩 ⑦ 自定义方式 ⑧ 滚的升级 5、使用限制 第三章 主要定义 …...

Vue2 第一节_Vue2上手_插值表达式{{}}_访问数据和修改数据_Vue开发者工具

文章目录 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染2. 插值表达式{{}}3. 访问数据和修改数据4. vue响应式5. Vue开发者工具--方便调试 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染 准备容器引包创建Vue实例 new Vue()指定配置项 ->渲染数据 准备一个容器,例如: …...

SpringBoot+uniapp 的 Champion 俱乐部微信小程序设计与实现,论文初版实现

摘要 本论文旨在设计并实现基于 SpringBoot 和 uniapp 的 Champion 俱乐部微信小程序&#xff0c;以满足俱乐部线上活动推广、会员管理、社交互动等需求。通过 SpringBoot 搭建后端服务&#xff0c;提供稳定高效的数据处理与业务逻辑支持&#xff1b;利用 uniapp 实现跨平台前…...

06 Deep learning神经网络编程基础 激活函数 --吴恩达

深度学习激活函数详解 一、核心作用 引入非线性:使神经网络可学习复杂模式控制输出范围:如Sigmoid将输出限制在(0,1)梯度传递:影响反向传播的稳定性二、常见类型及数学表达 Sigmoid σ ( x ) = 1 1 +...

【分享】推荐一些办公小工具

1、PDF 在线转换 https://smallpdf.com/cn/pdf-tools 推荐理由&#xff1a;大部分的转换软件需要收费&#xff0c;要么功能不齐全&#xff0c;而开会员又用不了几次浪费钱&#xff0c;借用别人的又不安全。 这个网站它不需要登录或下载安装。而且提供的免费功能就能满足日常…...

C++ 设计模式 《小明的奶茶加料风波》

&#x1f468;‍&#x1f393; 模式名称&#xff1a;装饰器模式&#xff08;Decorator Pattern&#xff09; &#x1f466; 小明最近上线了校园奶茶配送功能&#xff0c;业务火爆&#xff0c;大家都在加料&#xff1a; 有的同学要加波霸 &#x1f7e4;&#xff0c;有的要加椰果…...

C语言中提供的第三方库之哈希表实现

一. 简介 前面一篇文章简单学习了C语言中第三方库&#xff08;uthash库&#xff09;提供对哈希表的操作&#xff0c;文章如下&#xff1a; C语言中提供的第三方库uthash常用接口-CSDN博客 本文简单学习一下第三方库 uthash库对哈希表的操作。 二. uthash库哈希表操作示例 u…...

在 Visual Studio Code 中使用驭码 CodeRider 提升开发效率:以冒泡排序为例

目录 前言1 插件安装与配置1.1 安装驭码 CodeRider1.2 初始配置建议 2 示例代码&#xff1a;冒泡排序3 驭码 CodeRider 功能详解3.1 功能概览3.2 代码解释功能3.3 自动注释生成3.4 逻辑修改功能3.5 单元测试自动生成3.6 代码优化建议 4 驭码的实际应用建议5 常见问题与解决建议…...

【PX4飞控】mavros gps相关话题分析,经纬度海拔获取方法,卫星数锁定状态获取方法

使用 ROS1-Noetic 和 mavros v1.20.1&#xff0c; 携带经纬度海拔的话题主要有三个&#xff1a; /mavros/global_position/raw/fix/mavros/gpsstatus/gps1/raw/mavros/global_position/global 查看 mavros 源码&#xff0c;来分析他们的发布过程。发现前两个话题都对应了同一…...