#ifndef List_H #define List_H #include "iostream" using namespace std; template<typename T> class List { protected: unsigned lenght; struct list_node { list_node* prev; list_node* next; T data; }; list_node* node; //头节点,data字段未使用/// public: class Iterator { friend class List; public: Iterator(){} Iterator& operator++(int) { Iterator temp = *this; ++*this; return temp; } Iterator& operator++() { node = (*node).next; return *this; } Iterator& operator--(int) { Iterator temp = *this; --*this; return temp; } Iterator& operator--() { node = (*node).prev; return *this; } T& operator*()const { //return *node; return (*node).data; } //list_node& operator->()const ////////////////////////////////////////////////////////////////////////// //{ // return *node; //} bool operator==(const Iterator& x) /////////////////////////////////////////////////// { Iterator& temp = *this; return ((temp.node->data == x.node->data) &&(temp.node->prev == x.node->prev) &&(temp.node->next == x.node->next)); } bool operator!=(const Iterator& x) { return !(*this == x); } protected: list_node* node; Iterator(list_node* x):node(x){} }; public: List() { node = new list_node(); node->prev = node; node->next = node; lenght = 0; } ~List(){} void push_back(const T& x) { insert(end(),x); } //const对象只能使用const成员,const成员函数不会改变该对象(调用成员函数的对象) //非const对象可以使用任一成员,但非const版本是一个最佳匹配 unsigned size()const //const成员函数 不能从const成员函数返回指向类对象的普通引用,而只能返回*this作为一个const引用 { return lenght; } unsigned size() { return lenght; } bool empty()const { return lenght == 0; } bool empty() { return lenght == 0; } List(const List<T>& x) { node = new list_node(); lenght = 0; node->prev = node; node->next = node; Iterator temp = x.begin(); while (temp!=x.end()) { push_back(temp.node->data); temp = temp.node->next; } } List<T>& operator=(const List<T>& x) { Iterator temp = begin(); while (temp!=end()) { pop_front(); temp = begin(); /////////////////////////////////////////////////////////////////// } temp = x.begin(); while (temp!=x.end()) { push_back(temp.node->data); temp = temp.node->next; } return *this; } void push_front(const T& x) { insert(begin(),x); } void pop_front() { erase(begin()); } //template<typename T> //void List<T>::push_back(const T& x) //{ // insert(end(),x); //} void pop_back() { Iterator temp = end(); erase(--temp); } typename List<T>::Iterator insert(Iterator position, const T& x) { list_node* temp = new list_node(); temp->data = x; temp->next = position.node; temp->prev = (position.node)->prev; (position.node)->prev->next = temp; //((position.node)->prev).node->next = temp; //////////////////////////////////////////////////////////////// (position.node)->prev = temp; ++lenght; return temp; } void erase(Iterator position) { position.node->prev->next = position.node->next; position.node->next->prev = position.node->prev; //((position.node)->prev)->node->next = (position.node)->next; //((position.node)->next)->node->prev = (position.node)->prev; delete position.node; //delete 节点 --lenght; } Iterator begin()const { return(*node).next; } Iterator end()const { return node; } void sort() { } friend istream& operator>>(istream& is, List& li) { T temp; while (is>>temp) { li.push_back(temp); } return is; } friend ostream& operator<<(ostream& os, List& li) { os<<"< "; Iterator temp = li.begin(); while (temp != li.end()) { os<<*temp<<" "; ////////////////////////////////////////////////////////////////////////// ++temp; } os<<" >"; return os; } //list_node* next_avail; //list_node* last; /*struct list_node_buff { list_node_buff* next_buffer; list_node* buffer; }; list_node_buff* buffer_List;*/ //list_node* free_List; }; #endif