STL-Lesson002-MyList

来源:互联网 发布:淘宝网舞蹈衣服图片 编辑:程序博客网 时间:2024/06/08 04:11

MyList

/*MyList.h*/#ifndef _MYLIST_H_#define _MYLIST_H_namespace PoEdu{    //template<typename T>    template<typename T>    class MyList    {    public:        struct node        {            node *prev;            node *next;            T data;        };    public:        MyList();        MyList(size_t number, T &val);        MyList(const MyList<T> &other);        ~MyList();        MyList &operator=(const MyList &other)        {            do             {                if (other.head_ == head_)                {                    break;                }                Clear();                if (nullptr == other.head_)                {                    head_ = nullptr;                    tail_ = nullptr;                    size_ = 0;                    break;                }                if (1 == other.size_)                {                    node *temp = new node;                    temp->data = other.head_->data;                    head_ = temp;                    head_->prev = nullptr;                    tail_ = temp;                    tail_->next = nullptr;                    size_ = 1;                    break;                }                node *curNode = other.head_;                node *temp = new node;                temp->data = curNode->data;                head_ = temp;                head_->prev = nullptr;                tail_ = temp;                while (curNode->next != nullptr)                {                    curNode = curNode->next;                    temp = new node;                    temp->data = curNode->data;                    tail_->next = temp;                    temp->prev = tail_;                    tail_ = temp;                }                tail_->next = nullptr;                size_ = other.size_;            } while (false);            return *this;        }        T *Begin();        const T *Begin() const;        T *End();        const T *End() const;        bool Empty() const;        size_t Size() const;        T &Front();        const T &Front() const;        T &Back();        const T &Back() const;        void Assign(size_t number, const T &val);        void Push_front(const T &val);        void Pop_front();        void Push_back(const T &val);        void Pop_back();        void Insert(size_t pos, const T &val);        void Insert(size_t pos, size_t number, const T &val);// 这个函数待会在实现        void Erase(size_t pos);        void Erase(size_t first, size_t last); // 前开后闭区间        void Swap(MyList &other);        void Resize(size_t number);        void Resize(size_t number, T val);        void Remove(const T &val);        void Unique();        void Sort(bool SmallToBig = true);        void Reverse();        void Clear();    private:        node *FindByIndex(size_t pos)        {            node *curNode = nullptr;            // 从后向前查找            if (pos < size_ / 2)            {                curNode = head_;                for (size_t i = 0; i < pos; ++i)                {                    curNode = curNode->next;                }            }            else // 从前向后查找            {                curNode = tail_;                for (size_t i = size_; i > pos; --i)                {                    curNode = curNode->prev;                }            }            return curNode;        }    private:        node *head_;        node *tail_;        size_t size_;    };}#endif // !_MYLIST_H_
/*MyList.cpp*/#include <cassert>#include "MyList.h"namespace PoEdu{    template<typename T>    inline MyList<T>::MyList()    {        head_ = nullptr;        tail_ = nullptr;        size_ = 0;    }    template<typename T>    MyList<T>::MyList(size_t number, T & val)    {        size_ = number;        if (size_ > 0)        {            node *temp = new node;            temp->data = val;            head_ = temp;            tail_ = temp;            head->prev = nullptr;            for (size_t i=1; i>size_; ++i)            {                temp = new node;                temp->data = val;                temp->prev = tail_;                tail_->next = temp;                tail_ = temp;            }            tail_->next = nullptr;        }    }    template<typename T>    MyList<T>::MyList(const MyList<T>& other)    {        size_ = other.size_;        if (size_ > 0)        {            node *curNode = other.head_;            node *temp = new node;            temp->data = curNode->data;            head_ = temp;            tail_ = temp;            head->prev = nullptr;            while (curNode->next != nullptr)            {                curNode = curNode->next;                temp = new node;                temp->data = curNode->data;                temp->prev = tail_;                tail_->next = temp;                tail_ = temp;            }            tail_->next = nullptr;        }    }    template<typename T>    MyList<T>::~MyList()    {        Clear();    }    // 这个函数可能还有些问题    template<typename T>    T* MyList<T>::Begin()    {        return const_cast<T *>(static_cast<const MyList &>(*this).Begin());    }    template<typename T>    const T * MyList<T>::Begin() const    {        return &(head_->data);    }    template<typename T>    T * MyList<T>::End()    {        return const_cast<T *>(static_cast<const MyList &>(*this).End());    }    template<typename T>    const T * MyList<T>::End() const    {        return &(tail_->next);    }    template<typename T>    bool MyList<T>::Empty() const    {        return !size_;    }    template<typename T>    size_t MyList<T>::Size() const    {        return size_;    }    template<typename T>    T & MyList<T>::Front()    {        return head_->data;    }    template<typename T>    const T & MyList<T>::Front() const    {        return head_->data;    }    template<typename T>    T & MyList<T>::Back()    {        return tail_->data;    }    template<typename T>    const T & MyList<T>::Back() const    {        return tail_->data;    }    template<typename T>    void MyList<T>::Assign(size_t number, const T & val)    {        Clear();        MyList(number, val);    }    template<typename T>    void MyList<T>::Push_front(const T & val)    {        node *temp = new node;        temp->data = val;        ++size_;        if (1 == size_)        {            head_ = temp;            tail_ = temp;            head_->prev = nullptr;            tail_->next = nullptr;        }        else        {            temp->next = head_;            head_->prev = temp;            head_ = temp;            head_->prev = nullptr;        }    }    template<typename T>    void MyList<T>::Pop_front()    {        assert(head_);        --size_;        if (size_ > 0)        {            node *temp = head_;            head_ = head_->next;            head_->prev = nullptr;            delete temp;            temp = nullptr;        }        else        {            delete head_;            head_ = nullptr;            tail_ = nullptr;        }    }    template<typename T>    void MyList<T>::Push_back(const T & val)    {        node *temp = new node;        temp->data = val;        ++size_;        if (1 == size_)        {            head_ = temp;            tail_ = temp;            head_->prev = nullptr;            tail_->next = nullptr;        }        else        {            temp->prev = tail_;            tail_->next = temp;            tail_ = temp;            tail_->next = nullptr;        }    }    template<typename T>    void MyList<T>::Pop_back()    {        assert(head_);        --size_;        if (size_ > 0)        {            node *temp = tail_;            tail_ = tail_->prev;            tail_->next = nullptr;            delete temp;            temp = nullptr;        }        else        {            delete head_;            head_ = nullptr;            tail_ = nullptr;        }    }    template<typename T>    void MyList<T>::Insert(size_t pos, const T & val)    {        node *temp = new node;        temp->data = val;        // 如果pos等于0,那么就从前面插入        if (0 == pos)        {            Push_front(val);        }        else if (size_ <= pos)        {            Push_back(val);        }        else        {            node *curNode = nullptr;            curNode = FindByIndex(pos);            temp->prev = curNode;            temp->next = curNode->next;            curNode->next->prev = temp;            curNode->next = temp;            ++size_;        }    }    template<typename T>    void MyList<T>::Insert(size_t pos, size_t number, const T & val)    {        for (size_t i=0; i<number; ++i)        {            Insert(pos, val);        }    }    template<typename T>    void MyList<T>::Erase(size_t pos)    {        if (pos >= size_-1)        {            Pop_back();        }        else if (pos == 0)        {            Pop_front();        }        else        {            node * curNode = FindByIndex(pos);            node *delNode = curNode->next;            curNode->next = delNode->next;            delNode->next->prev = curNode;            delete delNode;            --size_;        }    }    template<typename T>    void MyList<T>::Erase(size_t first, size_t last)    {        for (size_t i=first; i<last; ++i)        {            Erase(first);        }    }    template<typename T>    void MyList<T>::Swap(MyList & other)    {        if (size_ > 1 && other.size_ > 1)        {            // 交换head_            node *temp = head_->next;            head_->next = (other.head_)->next;            (other.head_)->next->prev = head_;            (other.head_)->next = temp;            temp->prev = other.head_;            // 交换head_->data            T data = head_->data;            head_->data = (other.head_)->data;            (other.head_)->data = data;            // 交换size_            size_t size = size_;            size_ = other.size_;            other.size_ = size;            // 交换tail_            temp = tail_->prev;            tail_->prev = (other.tail_)->prev;            (other.tail_)->prev->next = tail_;            (other.tail_)->prev = temp;            temp->next = other.tail_;            // 交换tail_-data            data = tail_->data;            tail_->data = (other.tail_)->data;            (other.tail_)->data = data;        }    }    template<typename T>    void MyList<T>::Resize(size_t number)    {        if (number > size_)        {            T temp = { 0 };            for (size_t i=size_; i<number; ++i)            {                Push_back(temp);            }        }        else        {            for (size_t i=size_; i>number; --i)            {                Pop_back();            }        }    }    template<typename T>    void MyList<T>::Resize(size_t number, T val)    {        if (number > size_)        {            for (size_t i = size_; i < number; ++i)            {                Push_back(val);            }        }        else        {            for (size_t i = size_; i > number; --i)            {                Pop_back();            }        }    }    template<typename T>    void MyList<T>::Remove(const T & val)    {        node *temp = head_;        for (size_t i=0; i<size_; ++i)        {            if (temp->data == val)            {                Erase(i);            }            temp = temp->next;        }    }    template<typename T>    void MyList<T>::Unique()    {        node *curNode1 = head_;        node *curNode2 = nullptr;        T temp;        bool bDel = false;        for (size_t i=0; i<size_; ++i)        {            temp = curNode1->data;            bDel = false;            curNode2 = curNode1;            for (size_t j=i; j<size_; ++j)            {                if (temp == curNode2->data)                {                    if (bDel)                    {                        Erase(j);                    }                    bDel = true;                }                curNode2 = curNode2->next;            }            curNode1 = curNode1->next;        }    }    template<typename T>    void MyList<T>::Sort(bool bSmallToBig)    {    }    template<typename T>    void MyList<T>::Reverse()    {    }    template<typename T>    void MyList<T>::Clear()    {        node *temp;        for (; size_ > 0; --size_)        {            temp = head_;            head_ = head_->next;            delete temp;        }        temp = nullptr;    }}

Test

#include <list>#include "MyList.cpp"int main(){    using namespace PoEdu;    MyList<int> myList;    myList.Push_front(1);    myList.Push_front(2);    myList.Push_front(3);    myList.Pop_front();    myList.Pop_front();    myList.Pop_front();    myList.Push_back(7);    myList.Push_back(8);    MyList<int> myList1;    myList1.Push_back(100);    myList1.Push_back(200);    myList1.Push_back(200);    myList1.Push_back(300);    myList1.Unique();    int i = myList1.Back();    myList1.Remove(300);    myList1.Swap(myList);    system("pause");    return 0;}
原创粉丝点击