// // Created by DevilInChina on 2018/6/25. // #include <iostream> #include <algorithm> #include <functional> using namespace std; template <typename T> class List; template <typename T> class node{///双向链表节点,存储前指针后指针及元素本身。 friend class List<T>; node *pre; node *next; public: T ele; node(T &A):ele(A){ pre = nullptr; next= nullptr; } node(){ pre = nullptr; next= nullptr; } T&operator*(){ return ele;} ~node(){ } }; template <typename T> class List{ private:///pData为链表表头,en为链表表尾均不存放数据 unsigned cnt;///元素个数计数 node <T>*pData; node <T>*en; node <T>*last;///最后一个实际元素节点 public: ///与iterator类混合使用,进行迭代访问。 node<T> *begin(){ return pData->next;} node<T> *end(){ return en;} class iterator{ node<T>*p; friend class List<T>; public: T&operator*(){ return p->ele; } node<T>*operator++(){ ///没有设计超限访问报错,因为笔者认为是用户的错 p = p->next; return p; } bool operator!=(node<T>*t){ return p!=t;} bool operator==(node<T>*t){ return p==t;} void operator=(node<T>*t){p = t;} }; ///构造之初均设计好首尾节点 List(){ cnt = 0; pData = new node<T>; en = new node<T>; last = pData; en->pre = pData; pData->next = en; } List(T*a,T*b){ cnt = (unsigned int)(b - a); pData = new node<T>; last = pData; while (a!=b){ last->next = new node<T>(*a); last ->next ->pre = last; last = last->next; a++; } en = new node<T>; en->pre = last; last->next = en; } List(T a, unsigned int n){ cnt = 0; pData = new node<T>; last = pData; while (cnt!=n){ last->next = new node<T>(a); last ->next ->pre = last; last = last->next; ++cnt; } en = new node<T>; en->pre = last; last->next = en; } ///可更改排序规则的排序,实现一劳永逸,默认情况需要元素重载小于号运算符 void sort(std::function<bool(const T&,const T&)> cmp = [&](const T&a,const T&b)->bool{ return a < b;}){ node<T>**dat; node<T>*it; dat = new node<T>* [cnt]; it = pData->next; std::function<bool(const node<T>*,const node<T>*)> fun; fun = [&](const node<T>*a,const node<T>*b)->bool{ return cmp(a->ele,b->ele); }; for(int i = 0 ; i < cnt ; ++i){ dat[i]=it;///为新生成的指针数组初始化 it=it->next; } std::sort(dat,dat+cnt,fun); ///进行索引排序,避免大量复制 for(int i = 0 ; i < cnt ; ++i){ if(i!=cnt-1)dat[i]->next=dat[i+1]; if(i)dat[i]->pre = dat[i-1]; } pData->next=dat[0]; dat[0]->pre=pData; dat[cnt-1]->next = en; en->pre = dat[cnt-1]; last = dat[cnt-1]; delete []dat; } T&front(){ return pData->next->ele; } void push_back(T A){ last -> next = new node<T>(A); last ->next ->pre = last; last = last->next; last->next = en;; en->pre = last; cnt++; } void push_front(T A){ if(pData->next== nullptr){ push_back(A); return; } node<T>*p = new node<T>(A); p->next = pData->next; pData->next->pre = p; pData->next = p; p->pre = pData; cnt++; } void pop_back(){ last = last->pre; delete last->next; last->next = en; en->pre = last; --cnt; } void pop_front(){ node<T>*tmp = pData->next; pData->next = tmp->next; tmp->next->pre = pData; delete tmp; --cnt; } ///三个insert实际上都依靠最后的insert完成,减少代码量,略微增加机器的负担 ///且超出长度默认合并到最后一项,没有提示 void insert(unsigned int pos,T*A,T*B){ List <T> C(A,B); insert(pos,C); } void insert(unsigned int pos,T A){ T pa[2]; pa[0] = A; insert(pos,pa,pa+1); } void insert(unsigned int pos,List<T>&A){ if(pos>=cnt){ merge(A); } else { node<T> *it = pData; while (pos--) { it = it->next; } A.last->next = it->next; it->next->pre=A.last; it->next = A.pData->next; A.pData->next->pre = it; A.pData->next = A.en; A.en->pre = A.pData; cnt+=A.cnt; A.cnt = 0; } } node<T>* erase(iterator i){///删除元素后返回上一个元素指针 if(i.p== en) return en->pre; node<T>*tmp = i.p; i.p = i.p->pre; tmp->pre->next = tmp->next; tmp->next->pre = tmp->pre; delete tmp; return i.p; } node<T>*find(T a) {///只用定义了 < 运算符的元素可以进行查找 node<T>*ipos = pData; while (ipos->next!=en){ if(!(ipos->ele<a)&&!(a<ipos->ele)) return ipos; ipos = ipos->next; } return en; } void merge(List<T>&A){ if(!A.size())///没有这一句会出问题导致链表自环 return; last->next = A.pData->next; A.pData->next->pre = last; A.last->next = en; en->pre = A.last; last = A.last; A.last = A.pData; A.pData->next = A.en; A.en->pre = A.pData; cnt+=A.cnt; A.cnt = 0; } void clear(){ while (pData->next!=en){ pData = pData->next; delete pData->pre; } pData->next = en; en->pre = pData; cnt = 0; } T&operator[](unsigned int k){ if(k>=cnt){ cerr<<"seg fault"<<" "; return pData->ele; } node<T>* it = pData; while (k--){ it = it->next; } return it->next->ele; } unsigned int size(){ return cnt;} unsigned int length(){ return cnt;} ~List(){ while (pData->next){ pData = pData->next; delete pData->pre; } delete pData; delete en; } }; int main(){ /// test }