利用模板类迭代器实现链表

来源:互联网 发布:财神软件 编辑:程序博客网 时间:2024/06/05 14:22
//#pragma once#include <iostream>using namespace std;template<class T>struct ListNode{    ListNode(const T& data = T())    : _pPre(0)    , _pNext(0)    , _data(data)    {}    ListNode<T>* _pPre;    ListNode<T>* _pNext;    T _data;};template<class T, class Ref, class Ptr>  //模板template<class T,class T&,class T*)class ListIterator                           //迭代器{    typedef ListIterator<T, Ref, Ptr> Self;public:    ListIterator()        : _pCur(0)    {}    ListIterator(ListNode<T>* pCur)        : _pCur(pCur)    {}    ListIterator(const Self& s)        : _pCur(s._pCur)    {}    Ref operator*()//返回data    {        return _pCur->_data;    }    Ptr operator->()//返回对象的地址    {        return &(operator*());        //return &(_pCur->_data);    }    Self& operator++()//前置++    {        _pCur = _pCur->_pNext;        return*this;    }    Self operator++(int)//后置++    {        Self temp(*this);        _pCur = _pCur->_pNext;        return temp;    }    Self& operator--()//前置--    {        _pCur = _pCur->_pPre;        return*this;    }    Self operator--(int)//后置--    {        Self temp(*this);        _pCur = _pCur->_pPre;        return temp;    }    bool operator!=(const Self& s)    {        return _pCur != s._pCur;    }    bool operator==(const Self& s)    {        return _pCur == s._pCur;    }    ListNode<T>* _pCur;};template<class T>class List{public:    typedef ListIterator<T, T&, T*> Iterator;    typedef ListNode<T> Node;public:    List()        : _pHead(new Node)    {        _pHead->_pNext = _pHead;        _pHead->_pPre = _pHead;    }    // 1 2 3 4 5    List(const T* array, size_t size)//带参数的构造函数        : _pHead(new ListNode<T>)    {        _pHead->_pNext = _pHead;        _pHead->_pPre = _pHead;        for (size_t i = 0; i < size; ++i)            PushBack(array[i]);    }    List(const List<T>& l);    List<T>& operator=(const List<T>& l);    ~List()    {        Clear();        delete _pHead;        _pHead = NULL;    }    /////////////////////////////////////////////////////    Iterator Begin()    {        return Iterator(_pHead->_pNext);    }    Iterator End()    {        return Iterator(_pHead);    }    /////////////////////Modify//////////////////////////    void PushBack(const T& data)    {        ListNode<T>* pNewNode = new ListNode<T>(data);        // 空链表        if (Empty())        {            _pHead->_pNext = pNewNode;            pNewNode->_pNext = _pHead;            pNewNode->_pPre = _pHead;            _pHead->_pPre = pNewNode;        }        else        {            ListNode<T>* pTail = _pHead->_pPre;            pTail->_pNext = pNewNode;            pNewNode->_pPre = pTail;            pNewNode->_pNext = _pHead;            _pHead->_pPre = pNewNode;        }    }    void PopBack()    {        if (Empty())            return;        else        {            ListNode<T>* pTail = _pHead->_pPre->_pPre;            delete pTail->_pNext;            pTail->_pNext = _pHead;            _pHead->_pPre = pTail;        }    }    void PushFront(const T& data)    {        ListNode<T>* pNewNode = new ListNode<T>(data);        pNewNode->_pNext = _pHead->_pNext;        _pHead->_pNext->_pPre = pNewNode;        pNewNode->_pPre = _pHead;        _pHead->_pNext = pNewNode;    }    void PopFront()    {        if (Empty())            return;        else        {            ListNode<T>* pDel = _pHead->_pNext;            pDel->_pNext->_pPre = _pHead;            _pHead->_pNext = pDel->_pNext;            delete pDel;        }    }    Iterator Insert(Iterator pos, const T& data)    {        ListNode<T>* pNewNode = new ListNode<T>(data);        pNewNode->_pNext = pos._pCur;        pos._pCur->_pPre->_pNext = pNewNode;        pNewNode->_pPre = pos._pCur->_pPre;        pos._pCur->_pPre = pNewNode;        return Iterator(pNewNode);    }    Iterator Find(const T&data)  //指定位置查找    {        Iterator it = Begin();        while (it != End())        {            if (*it == data)                return it;            ++it;        }        return End();    }    Iterator Erase(Iterator pos)    {        ListNode<T>* Ret = pos._pCur->_pNext;        pos._pCur->_pPre->_pNext = pos._pCur->_pNext;        pos._pCur->_pNext->_pPre = pos._pCur->_pPre;        delete pos._pCur;        return Iterator(Ret);    }    bool Empty()const    {        return _pHead->_pNext == _pHead;    }    size_t Size()const        //计算其大小    {#if 1        size_t count = 0;                          //方法1        ListNode<T>* pCur = _pHead->_pNext;        while (pCur != _pHead)        {            count++;            pCur = pCur->_pNext;        }        return count;#endif#if 0        size_t count = 0;                     //方法2        Iterator it = Begin();        while (it != End())        {            count++;            ++it;        }        return count;#endif    }    T& Front()    {        return _pHead->_pNext->_data;    }    const T& Front()const    {            return _pHead->_pNext->_data;    }    T& Back()    {        return _pHead->_pPre->_data;    }    const T& Back()const    {        return _pHead->_pPre->_data;    }    void Clear()    {        Iterator it = Begin();        while (it != End())        {            it = Erase(it);        }        _pHead->_pNext = _pHead;        _pHead->_pPre = _pHead;    }private:    ListNode<T>* _pHead;};#if 1void TestList(){    int array[] = { 1, 2, 3, 4, 5 };    List<int> l(array, sizeof(array) / sizeof(array[0]));    l.PushBack(6);    l.PushFront(0);    List<int>::Iterator it = l.Begin();    while (it != l.End())    {        cout << *it << "->";        ++it;    }    cout << "->NULL" << endl;    cout << l.Size() << endl;    List<int>::Iterator pos =l. Find( 2);    l.Insert(pos, 7);    it = l.Begin();    while (it != l.End())    {        cout << *it << "->";        ++it;    }    cout << "->NULL" << endl;    l.Erase(pos);    it = l.Begin();    while (it != l.End())    {        cout << *it << "->";        ++it;    }    cout << "->NULL" << endl;    l.Clear();    cout << l.Size() << endl;}#endifint main(){    TestList();        system("pause");        return 0;}