您可以编写此LinkedList模板类,只需在任意位置调用它:
#ifndef LinkedList_hpp #define LinkedList_hpp template <class T> class ListNode { public: T element; ListNode* next; ListNode* prev; ListNode(T element, ListNode* prev, ListNode* next) : element(element) { this->next = next; this->prev = prev; }; }; template <class T> class LinkedList { private: int length; ListNode<T>* head; ListNode<T>* tail; ListNode<T>* curr; public: LinkedList(); LinkedList(const LinkedList<T>&); ~LinkedList(); T& getCurrent(); T& First() const; T& Last() const; int getLength(); void Append(T); void DeleteLast(); void DeleteFirst(); void DeleteCurrent(); bool next(); bool moveToStart(); bool prev(); void Delete(T&); bool Search(T); void Clear(); void PutFirstToLast(); void Update(T elem); LinkedList& operator = (const LinkedList<T>&); }; template <class T> LinkedList<T>::LinkedList() { length = 0; head = nullptr; tail = nullptr; curr = nullptr; } template <class T> LinkedList<T>::LinkedList(const LinkedList<T> & list) { length = 0; head = nullptr; tail = nullptr; curr = nullptr; ListNode<T> * temp = list.head; while(temp != nullptr) { Append(temp->element); temp = temp->next; } } template <class T> LinkedList<T> & LinkedList<T>::operator=(const LinkedList<T> & list) { Clear(); ListNode<T> * temp = list.head; while(temp != nullptr) { Append(temp->element); temp = temp->next; } return *this; } template <class T> LinkedList<T>::~LinkedList() { Clear(); } template<class T> T& LinkedList<T>::getCurrent() { return curr->element; } template<class T> T& LinkedList<T>::First() const { return head->element; } template<class T> T& LinkedList<T>::Last() const { return tail->element; } template<class T> int LinkedList<T>::getLength() { return length; } template <class T> void LinkedList<T>::Append(T element) { ListNode<T> * node = new ListNode<T>(element, tail, nullptr); if(length == 0) curr = tail = head = node; else { tail->next = node; tail = node; } length++; } template <class T> void LinkedList<T>::DeleteLast() { if(length == 0) return; curr = tail; DeleteCurrent(); } template <class T> void LinkedList<T>::DeleteFirst() { if(length == 0) return; curr = head; DeleteCurrent(); } template <class T> bool LinkedList<T>::next() { if(length == 0) return false; if(curr->next == nullptr) return false; curr = curr->next; return true; } template <class T> bool LinkedList<T>::moveToStart() { curr = head; return length != 0; } template<class T> bool LinkedList<T>::prev() { if(length == 0) return false; if(curr->prev != nullptr) return false; curr = curr->prev; return true; } template <class T> void LinkedList<T>::Delete(T & elem) { if(Search(elem)) DeleteCurrent(); } template <class T> void LinkedList<T>::DeleteCurrent() { if(length == 0) return; length--; ListNode<T> * temp = curr; if(temp->prev != nullptr) temp->prev->next = temp->next; if(temp->next != nullptr) temp->next->prev = temp->prev; if(length == 0) head = curr = tail = nullptr; else if(curr == head) curr = head = head->next; else if(curr == tail) curr = tail = tail->prev; else curr = curr->prev; delete temp; } template <class T> bool LinkedList<T>::Search(T elem) { if(length == 0) return false; if(moveToStart()) do { if(curr->element == elem) return true; } while (next()); return false; } template <class T> void LinkedList<T>::PutFirstToLast() { if(length < 2) return; ListNode<T>* temp = head->next; head->next->prev = nullptr; head->next = nullptr; head->prev = tail; tail->next = head; tail = head; head = temp; } template <class T> void LinkedList<T>::Update(T elem) { if(Search(elem)) curr->element = elem; } template <class T> void LinkedList<T>::Clear() { if(length == 0) return; ListNode<T> * temp = head; while(temp != nullptr) { head = head->next; delete temp; temp = head; } head = curr = tail = nullptr; } #endif
使用此课程如下:
LinkedList<int> list; list.append(1); list.append(2); list.append(3); list.append(4); int my_integer; if(list.moveToStart()) do{ my_integer = list.getCurrent(); }while(list.next());
Arduino的标准C ++ 可能是一种选择。它可以让你使用 STL 向量 在Arduino。
arduino的内存有限,因此您需要知道允许的航路点数。在这种情况下,用于保存分配的航点的存储器指针(地址)的简单数组将提供您需要的序列/顺序。将一个阵列插槽保留为工作区域将允许移动路标(重新排序)。
听起来你想要实现一个简单的链表。链接列表允许您在没有与C ++向量关联的开销的情况下移动对象(在您的情况下为航点)。
这是一个实现 在GitHub上 。
您还可以拥有固定的航点结构数组,并且如果航点正在使用中,则在结构中包含变量。添加航点时,您必须循环遍历数组,直到找到未使用的结构。