双向链表


#pragma once

class IteratorMismatchException
{

};

template <typename Object>
class List
{
private:
    struct Node
    {
        Object data;
        Node   *prev;
        Node   *next;

        Node(const object& d = object(), Node *p = 0, Node *n = 0)
            :data(d), prev(p), next(n)
        {

        }
    };

public:
    class const_iterator
    {
    public:
        const_iterator() :current(0)
        {

        }

        const Object& operator* ()const
        {
            return retrieve();
        }

        const_iterator & operator++()
        {
            current = current->next;
            return *this;
        }

        const_iterator operator++ (int)
        {
            const_iterator odl = *this;
            ++(*this);
            return old;
        }

        bool operator== (const const_iterator & rhs) const
        {
            return current == rhs.current;
        }

        bool operator!= (const const_iterator & rhs) const
        {
            return !(*this == rhs);
        }

    protected:
        const List<Object> *theList;
        Node *current;

        Object& retrieve() const
        {
            return current->data;
        }

        const_iterator(Node *p) :current(p)
        {

        }

        const_iterator(const List<Object>& lst, Node *p)
            :theList(&lst), current(p)
        {

        }

        void assertIsValid() const
        {
            if (theList == 0 || current == 0 || current == theList)
            {
                throw ItertorOutOfBoundsException();
            }
        }

        friend class List<Object>;
    };

    class iterator :public const_iterator
    {
    public:
        iterator()
        {

        }
        
        iterator operator++ (int)
        {
            iterator old = *this;
            ++(*this);
            return old;
        }

    protected:
        iterator(Node *p) :const_iterator(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 = begin(); itr != rhs.end(); itr++)
        {
            push_back(*itr);
        }

        return *this;
    }

    iterator begin()
    {
        return iterator(head->next);
    }

    const_iterator begin() const
    {
        return const_iterator(head->next);
    }

    iterator end()
    {
        return iterator(tail);
    }

    const_iterator end()
    {
        return const_iterator(tail);
    }

    int size()
    {
        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());
    }

    //Insert x before itr
    iterator insert(iterator itr, const Object& x)
    {
        Node *p = itr.current;
        theSize++;
        return iterator(p->prev = p->prev->next = new Node(x, p));
    }

    // Erase item at itr
    iterator erase(iterator itr)
    {
        Node *p = itr.current;
        iterator retVal(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 = from; itr != to;)
        {
            itr = erase(itr);
        }

        return to;
    }

private:
    int theSize;
    Node *head;
    Node *tail;

    void init()
    {
        theSize = 0;
        head = new Node;
        tail = new Node;
        head->next = tail;
        tail->prev = head;
    }
};
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值