#ifndef LIST_H #define LIST_H #include "iostream" #include "cstddef" using namespace std; template<typename T> class List { private: struct list_node { T item; list_node* prev; list_node* next; list_node(){} list_node(T temp) { item = temp; } }; list_node* head; list_node* tail; list_node* current; long lenght; public: List() { head = NULL; tail = NULL; current = NULL; lenght = 0; } List(List& rlist) { head = NULL; // tail = NULL; current = NULL; lenght = 0; rlist.current = rlist.head; while (rlist.current != rlist.tail) //rlist != NULL 直到tail退出,处理最后一个节点 { list_node* temp = new list_node(rlist.current->item); if (tail == NULL) //从前到后插入,也就是push_back() { temp->prev = temp; temp->next = temp; head = temp; tail = temp; } else { temp->prev = tail; tail->next = temp; temp->next = head; head->prev = temp; tail = temp; } rlist.current = (rlist.current)->next; } if (tail != NULL) { list_node* temp = new list_node(rlist.current->item); temp->prev = tail; tail->next = temp; temp->next = head; head->prev = temp; tail = temp; } lenght = rlist.lenght; } List& operator=(List& rlist) { clear(); //head = tail = NULL; rlist.current = rlist.head; while (rlist.current != rlist.tail) //rlist != NULL 直到tail退出,处理最后一个节点 { list_node* temp = new list_node(rlist.current->item); if (tail == NULL) //从前到后插入,也就是push_back() { temp->prev = temp; temp->next = temp; head = temp; tail = temp; } else { temp->prev = tail; tail->next = temp; temp->next = head; head->prev = temp; tail = temp; } rlist.current = rlist.current->next; } if (tail != NULL) { list_node* temp = new list_node(rlist.current->item); temp->prev = tail; tail->next = temp; temp->next = head; head->prev = temp; tail = temp; } lenght = rlist.lenght; return *this; } ~List(){} void clear() { if (head == NULL) { return ; } else { current = head; while(current != tail) //从前到后删除,类似pop_front() { list_node* temp = current; current->next->prev = current->prev; current->prev->next = current->next; head = current = current->next; // delete temp; --lenght; } //处理最后一个节点 delete current; --lenght; head = tail = current = NULL; } } void insert(long index, const T x) { if (index < lenght) { current = head; for (int i=1; i<index; i++) /// { current = current->next; } list_node* temp = new list_node(x); temp->prev = current->prev; temp->next = current; current->prev->next = temp; current->prev = temp; current = current->prev; ++lenght; } else return; } void erase(long index) { if (index < lenght) { current = head; for (int i=1; i<index; i++) { current = current->next; } list_node* temp = current; current->prev->next = current->next; current->next->prev = current->prev; current = current->prev; delete temp; --lenght; } else return; } void push_front(const T x) { list_node* temp = new list_node(x); //head->prev = temp; if (head == NULL) { temp->next = temp; temp->prev = temp; head = temp; tail = temp; } else { temp->next = head; head->prev = temp; temp->prev = tail; tail->next = temp; head = temp; } ++lenght; } void pop_front() { if (lenght == 0) { return; } else if (lenght == 1) { delete head; head = NULL; tail = NULL; } else { list_node *temp = head; head->next->prev = head->prev; tail->next = head->next; head = head->next; delete temp; } --lenght; } void push_back(const T x) { list_node* temp = new list_node(x); //tail->next = temp; if (tail == NULL) { temp->prev = temp; temp->next = temp; head = temp; tail = temp; } else { temp->next = head; head->prev = temp; temp->prev = tail; tail->next = temp; tail = temp; } ++lenght; } void pop_back() { if (lenght == 0) { return ; } if (lenght == 1) { delete tail; tail = NULL; head = NULL; } else { list_node* temp = tail; tail->prev->next = tail->next; head->prev = tail->prev; tail = tail->prev; delete temp; } } list_node* operator++(int) { list_node* temp = current; current = current->next; return temp; } list_node* operator++() { return (current = current->next); } list_node* operator--(int) { list_node* temp = current; current = current->prev; return temp; } list_node* operator--() { return (current = current->prev); } T operator*() { return current->item; //return (this->current).item; } list_node* operator->() { return current; } long size() { return lenght; } bool empty() { return long == 0; } void setCurrent() //const :lvalue指定对象 { current = head; } friend ostream& operator<<(ostream& os, List& cl) { if(cl.head == NULL) return os; os<<"< "; cl.setCurrent(); while (cl.current != cl.tail) { os<<*cl<<" "; ++cl; } os<<*cl<<" "; os<<" >"<<endl; return os; } }; #endif