List

来源:互联网 发布:单片机编译链接 编辑:程序博客网 时间:2024/04/27 19:28
template <typename Object>class List{private:    struct Node{        Object data;        Node *prev;        Node *next;        Node(const Object & d=Object(),Node *p=NULL,Node *n=NULL)                :data(d),prev(p),next(n){}    };public:    class const_iterator{    public:        const_iterator():current(NULL){}        const Object & operator*() const{            return retrieve();        }        //前++        const_iterator & operator++(){            current=current->next;            return *this;        }        //后++        const_iterator operator++(int){            const_iterator old=*this;            ++(*this);            return old;        }        bool operator==(const const_iterator & rhs) const {            return current==rhs.current;        }        bool operator!=(const const_iterator & rhs) const {            return current!=rhs.current;        }    protected:        Node *current;        const List<Object> *theList;        Object & retrieve() const{            return this->current->data;        }        const_iterator(const List<Object> & lst,Node *p)                :current(p),theList(&lst){}        void assertIsValid() const{            if(theList==NULL||current==NULL||current==theList->head){                cout<< "false";            }        }        friend class List<Object>;    };    class iterator:public const_iterator{    public:        iterator(){};        Object & operator*(){                return this->retrieve();        };        const Object & operator*() const{            return const_iterator::operator*();        }        iterator &operator++(){            this->current=this->current->next;            return *this;        }        iterator operator++(int){            iterator old=*this;            ++(*this);            return old;        }    protected:        iterator(const List<Object> & lst,Node *p):const_iterator(lst,p){}        friend class List<Object>;    };public:    List(){        init();    }    ~List(){        clear();        delete head;        delete tail;    }    List(const List & rhs){        init();        *this=rhs;    }    const List & operator=(const List &rhs){        if(this==&rhs){            return *this;        }        clear();        for(const_iterator itr=rhs.begin();itr!=rhs.end();itr++){            push_back( *itr );        }        return *this;    }    iterator begin(){        return iterator(*this,head->next);    }    const_iterator begin() const{        return const_iterator(*this,head->next);    }    iterator end(){        return iterator(*this,tail);    }    const_iterator end() const{        return const_iterator(*this,tail);    }    int size() const{        return theSize;    }    bool empty() const{        return size()==0;    }    void clear(){        while(!empty()){            pop_front();        }    }    Object & front(){        return *begin();    };    const Object & front() const{        return *begin();    }    Object & back(){        return *--end();    }    const Object & back() const{        return *--end();    }    void push_front(const Object & x){        insert(begin(),x);    }    void push_back(const Object & x){        insert(end(),x);    }    void pop_front(){        erase(begin());    }    void pop_back(){        erase(--end());    }    iterator insert(iterator itr,const Object & x){        //在itr前面插入        itr.assertIsValid();        Node *p=itr.current;        theSize++;        //Node *newNode=new Node(x,p->prev,p);        //p->prev->next=newNode;        //p->prev=newNode;        return iterator(*this,p->prev=p->prev->next=new Node(x,p->prev,p));    }    iterator erase(iterator itr){        //删除当前指向的节点        Node *p=itr.current;        //赋值        iterator retval(*this,p->next);        p->prev->next=p->next;        p->next->prev=p->prev;        delete p;        theSize--;        return retval;    }    iterator erase(iterator start,iterator end){        for(iterator itr=start;itr!=end;){            itr=erase(itr);        }        return end;    }private:    int theSize;    Node *head;    Node *tail;    void init(){        theSize=0;        head=new Node;        tail=new Node;        head->next=tail;        tail->prev=head;    }};

按照<<数据结构与算法分析 C++描述>>重新敲了一遍

0 0
原创粉丝点击