zoukankan      html  css  js  c++  java
  • 双向链表实现简单的list

    双向链表结构:

    定义一个如下结构体

    struct Node
    {
        Object data;
        Node *next;
        Node *prev;
    };

    下面为list的具体实现:

    #include <iostream>
    using namespace std;
    
    template <typename Object>
    class List
    {
    private:
        //链表结点的定义
        struct Node
        {
            Object data;
            Node *next;
            Node *prev;
    
            Node(const Object &d = Object(), Node *p = nullptr, Node *n = nullptr)
                :data(d), next(n), prev(p){}
        };
    private:
        int theSize;
        Node *head;
        Node *tail;
    
        void init()
        {
            theSize = 0;
            head = new Node;
            tail = new Node;
            head->next = tail;
            tail->prev = head;
        }
    public:
        class const_iterator
        {
        public:
            const_iterator() :current(nullptr)
            {}
    
            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 !(*this == rhs);
            }
        protected:
            Node* current;
            Object &retrieve() const
            {
                return current->data;
            }
            const_iterator(Node *p) :current(p){}
    
            friend class List<Object>;
        };
    
        class iterator :public const_iterator
        {
        public:
            iterator(){}
            Object & operator* ()
            {
                return retrieve();
            }
    
            const Object & operator* () const
            {
                return const_iterator::operator*();
            }
    
            iterator &operator++ ()
            {
                current = current->next;
                return *this;
            }
    
            iterator &operator++ (int)
            {
                iterator old = *this;
                ++(*this);
                return old;
            }
        protected:
            iterator(Node *p) :const_iterator(p)
            {}
    
            friend class List<Object>;
        };
    public:
        List()
        {
            init();
        }
    
        //拷贝构造函数
        List(const List &rhs)
        {
            init();
            *this = rhs;
        }
    
        ~List()
        {
            clear();
            delete head;
            delete tail;
        }
    
        //重载操作符=
        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(head->next);
        }
    
        const_iterator begin() const
        {
            return const_iterator(head->next);
        }
    
        iterator end()
        {
            return iterator(tail);
        }
    
        const_iterator end() const
        {
            return const_iterator(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)
        {
            Node *p = itr.current;
            theSize++;
            Node *newNode = new Node(x, p->prev, p);
            p->prev = p->prev->next = newNode;
            return iterator(newNode);
        }
    
        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 = start; itr != end;)
            {
                itr = erase(itr);
            }
            return end;
        }
    };
    
    int main()
    {
        List<int> test;
        test.push_back(1);
        test.push_back(3);
        test.push_back(5);
        test.push_front(0);
        for (List<int>::iterator itr = test.begin(); itr != test.end();itr++)
        {
            cout << *itr << ' ';
        }
        return 0;
    }

    测试结果:

  • 相关阅读:
    USACO 1.3 warmhole
    hadoop本地库与系统版本不一致引起的错误解决方法
    hadoop安装遇到的各种异常及解决办法
    Hadoop学习笔记【分布式文件系统学习笔记】
    Hadoop学习笔记【Hadoop家族成员概述】
    Ext2.x学习笔记
    Memcached学习笔记
    关于反向生成url
    python 练习题- 图书租金计算
    python 练习题- letcode 168. Excel表列名称
  • 原文地址:https://www.cnblogs.com/zhangbaochong/p/5146350.html
Copyright © 2011-2022 走看看