深⼊学习ArduinoLinkedList库(⼀个变长的集合类数组)
授⼈以鱼不如授⼈以渔,⽬的不是为了教会你具体项⽬开发,⽽是学会学习的能⼒。希望⼤家分享给你周边需要的朋友或者同学,说不定⼤神成长之路有博哥的奠基⽯。。。
快速导航
如果觉得有⽤,⿇烦点赞收藏,您的⽀持是博主创作的动⼒。
⽂章⽬录
1.前⾔
博主是做Android App开发出⾝的,所以对Java这门语⾔算是有点了解。⽽在Java中,我经常使⽤到List这个集合类(所以集合,博主理解为⼀系列同类对象集中在⼀起的⼊⼝)。那么,在Arduino中是否也有这样类似于Java 的List⽤法呢?这就是本篇内容的重点 ——Arduino LinkedList。
2.LinkedList
2.1 LinkedList源码地址
直接点击 下载代码
2.2 LinkedList是什么
⼀系列 同类对象的集合(这点属性和数组⼀样)
可以动态添加或者删除对象,长度不固定(这点属性就是和数组⾮常⼤的区别,数组都是分配固定⼤⼩的内存空间,当你考虑动态长度的时候可以考虑这个库)
⽀持对象为 int, float, objects, Lists
2.3 安装LinkedList
可以通过Arduino IDE库管理器安装LinkedList,搜索“LinkedList”,然后点击下载(适合新⼿⼩⽩,直接上⼿使⽤)
也可以直接通过github下载源码,放到你的Arduino libraries⽂件夹
2.4 LinkedList⼯作原理
⼯作原理⾮常简单,就是构造链表,每个节点相连形成⼀条链,这样可以单独添加节点或者删除节点(请读者⾃⾏就查阅链表的数据结构)
LinkedList源码中定义的节点结构:
template<class T>// 泛型
struct ListNode
{
T data;// 每个节点对应的泛型数据
ListNode<T>*next;// 每个节点的下⼀个节点,这样就形成了链表
};
请记住关键的⼀点,除了最后⼀个节点,其他节点都会包含下⼀个节点的地址。
2.5 如何引⼊ LinkedList库
数组全部赋值为1
⾮常简单,直接引⼊:
#include <LinkedList.h>
⾄于怎么样去彻底了解这个库的使⽤⽅法,请看博主下⾯的源码分析。
3.LinkedList源码解析
通过查阅WifiManager的源码,整体代码⾮常简单,提供出来的⽅法调⽤也不多。这⾥博主就⼀个个⽅法详细讲解,并且深⼊去分析代码。⽅法分为⼏类:
初始化⽅法
添加类⽅法
删除类⽅法
其他⽅法
博主建议:先了解有什么⽅法,然后在后⾯例⼦讲解中去感受⽅法的使⽤。
3.1 初始化⽅法
简⽽⾔之,就是怎么创建构造函数。
3.1.1 LinkedList —— 初始化构造函数
构造函数有两个,⼀个不初始化集合中的对象,⼀个对集合中的对象进⾏默认初始化。函数1说明:
// 初始化所有的原始默认值,包括头尾节点,集合⼤⼩,上⼀个节点
template<typename T>
LinkedList<T>::LinkedList()
{
root=NULL;// 头结点
last=NULL;// 尾结点
_size=0;// 集合⼤⼩
lastNodeGot = root;// 上⼀个节点
lastIndexGot =0;// 上⼀个节点对应的索引
isCached = false;//这个暂时没知道怎么⽤
}
函数2说明:
// 初始化集合的数据从0-(sizeIndex-1)赋值为 _t
template<typename T>
LinkedList<T>::LinkedList(int sizeIndex, T _t){
for(int i =0; i < sizeIndex; i++){
add(_t);
}
}
个⼈习惯⽤函数1.
3.2 添加类⽅法
添加类⽅法,也就是往链表添加对象,长度+1。
3.2.1 add —— 添加对象到某个位置
针对添加位置的不同,⼜区分为两个⽅法。
函数1说明:
bool LinkedList<T>::add(T _t){
// 创建⼀个新的节点
ListNode<T>*tmp = new ListNode<T>();
tmp->data = _t;
tmp->next =NULL;
/
/ 判断是否已经有对象插⼊
if(root){
// Already have elements inserted
last->next = tmp;
last = tmp;
}else{
// 第⼀个对象
root = tmp;
last = tmp;
}
// 集合⼤⼩加1
_size++;
isCached = false;
return true;
}
函数2说明:
template<typename T>
bool LinkedList<T>::add(int index, T _t){
// index超过size,直接添加到表尾
if(index >= _size)
return add(_t);
// index=0 插⼊表头
if(index ==0)
return unshift(_t);
// 创建⼀个新的节点
ListNode<T>*tmp = new ListNode<T>(),
// 获取index-1这个节点,也就是插⼊点的位置*_prev =getNode(index-1);
// 断开链表并且把新节点插⼊对应点连接链表
tmp->data = _t;
tmp->next = _prev->next;
_prev->next = tmp;
_size++;
isCached = false;
return true;
}
这⾥⽤到了⼀个 获取节点 的⽅法 getNode:
ListNode<T>* LinkedList<T>::getNode(int index){
int _pos =0;
ListNode<T>* current = root;
// Check if the node trying to get is
// immediatly AFTER the previous got one
if(isCached && lastIndexGot <= index){
_pos = lastIndexGot;
current = lastNodeGot;
}
// 到对应的索引位置
while(_pos < index && current){
current = current->next;
_pos++;
}
// Check if the object index got is the same as the required
if(_pos == index){
// 到对应的节点内容返回节点
isCached = true;
lastIndexGot = index;
lastNodeGot = current;
return current;
}
return NULL;
}
3.2.2 unshift —— 添加对象到链表头部位置
函数说明:
template<typename T>
bool LinkedList<T>::unshift(T _t){
// 链表为空直接插⼊
if(_size ==0)
return add(_t);
// 设置当前节点的下⼀个节点是原来的root节点,这样就插⼊到头部了 ListNode<T>*tmp = new ListNode<T>();
tmp->next = root;
tmp->data = _t;
root = tmp;
_size++;
isCached = false;
return true;
}
3.3 删除类⽅法
删除类⽅法,也就是链表删除对象,长度-1。
3.3.1 remove —— 移除某个位置的对象,并且返回该对象函数说明:

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。