单项循环链表
//
// Created by 许加权 on 2021/7/12.
//#ifndef C11LEARN_SINGLECYCLELINK_H
#define C11LEARN_SINGLECYCLELINK_H
#include "chapter10.h"
template<typename T>
class SingleCycleL
{
public:HalfNode<T> *Nil;
public:SingleCycleL(){Nil = new HalfNode<T>();Nil->next = Nil;}SingleCycleL(const SingleCycleL<T> &l){Nil = new HalfNode<T>();Nil->next = Nil;copy(l);}const SingleCycleL<T>& operator = (const SingleCycleL<T> &l){clear();copy(l);return *this;}virtual ~SingleCycleL(){clear();if(Nil!= nullptr){delete Nil;Nil = nullptr;}}void clear(){HalfNode<T>* current = Nil->next;while (current != Nil){HalfNode<T>*node = current;current = current->next;delete node;}Nil->next = Nil;}void copy(const SingleCycleL<T> &l){HalfNode<T>* current = l.Nil->next;HalfNode<T>* current_self = Nil;while (current!= l.Nil){HalfNode<T> * node = new HalfNode<T>(current->key);current = current->next;current_self->next = node;current_self = node;}current_self->next = Nil;}
};
template<typename T>
void insert(SingleCycleL<T> & l,T key)
{HalfNode<T> * t = new HalfNode<T>(key);t->next = l.Nil->next;l.Nil->next = t;
}
template<typename T>
bool remove(SingleCycleL<T> & l,T key)
{HalfNode<T> *pre = l.Nil;HalfNode<T> *current = l.Nil->next;while (current->key!=key){pre = current;current = current->next;}if(current != l.Nil){pre->next = current->next;delete current;return true;}return false;
}
template<typename T>
HalfNode<T> search(SingleCycleL<T> & l,T key)
{l.Nil->key = key;HalfNode<T> *current = l.Nil->next;while (current->key!=key){current = current->next;}return current;
}
#endif //C11LEARN_SINGLECYCLELINK_H
辅助类HalfNode链接