list模拟实现

list模拟实现

前期我已经简单的介绍过list相关内容,今天进行list的模拟实现。

代码见下:

#pragma once

#include"Iterator.h"
#include<iostream>
#include<assert.h>

using namespace std;

template <class T>

struct ListNode
{
    ListNode<T>* _next;
    ListNode<T>* _prev;
    T _data;

    ListNode(const T& x)
        :_next(NULL)
        , _prev(NULL)
        , _data(x)
    {}
};

template <class T, class Ref, class Ptr>
struct _Iterator
{
    typedef _Iterator<T, Ref, Ptr> iter;
    typedef ListNode<T> Node;
    typedef Ref Reference;
    typedef Ptr Pointer;
    Node* _node;

    _Iterator(Node* node)
        :_node(node)
    {}

    Ref operator*()
    {
        return _node->_data; 
    }

    Ptr operator->()
    {
        return &(Node->_data);
    }

    iter& operator++()
    {
        _node = _node->_next;
        return *this;
    }

    iter operator++(int)
    {
        iter tmp(_node);
        _node = _node->_next;
        return tmp;
    }

    iter operator--()
    {
        _node = _node->_prev;
        return *this;
    }

    iter operator--(int)
    {
        iter tmp(_node);
        _node = _node->_prev;
        return tmp;
    }

    bool operator==(const iter& it)
    {
        return (_node == it._node);
    }

    bool operator!=(const iter& it)
    {
        return !(_node == it._node);
    }
};

template <class T>
class List
{
    typedef ListNode<T> Node; 
public:
    typedef _Iterator<T, T&, T*> Iterator;
    typedef _Iterator<T, const T&, const T*> ConstIterator;
    typedef __ReverseIterator<Iterator> ReverseIterator;

    List()
        :_head(new Node(T()))
    { 
        _head->_next = _head;
        _head->_prev = _head;
    }

    Iterator Begin()
    {
        return Iterator(_head->_next);
    }

    ConstIterator Begin() const
    {
        return ConstIterator(_head->_next);
    }

    ReverseIterator rBegin()
    {
        return End();
    }

    Iterator End()
    {
        return Iterator(_head);
    }

    ConstIterator End() const
    {
        return ConstIterator(_head);
    }

    ReverseIterator rEnd()
    {
        return Begin();
    }

    void PushBack(const T& x)
    {
        Insert(End(), x);
    }

    void PopBack()
    {
        Erase(--End());
    }

    void PushFront(const T& x)
    {
        Insert(Begin(), x);
    }

    void PopFront()
    {
        Erase(Begin());
    }

    void Insert(Iterator pos, const T& x)
    {
        Node* tmp = pos._node;
        Node* prev = tmp->_prev;

        Node* newNode = new Node(x);
        newNode->_next = tmp;
        newNode->_prev = prev;
        prev->_next = newNode;
        tmp->_prev = newNode;
    }

    Iterator Erase(Iterator& pos)
    {
        assert(pos != End());
        assert(_head->_next != _head);

        Node* next = pos._node->_next;
        Node* prev = pos._node->_prev;

        delete pos._node;

        prev->_next = next;
        next->_prev = prev;
        pos=prev;
        return next;
    }

private:
    Node* _head;
};

头文件包含的Iterator.h文件内容如下,其为一个容器适配器:

#pragma once

// 复用和效率

// 适配器模式 --> 复用
// List->__ListIterator
// Vector->T*
template<class Iterator>
struct __ReverseIterator
{
    Iterator _it;

    __ReverseIterator(Iterator it)
        :_it(it)
    {}

    typename Iterator::Reference operator*()
    {
        Iterator it = _it;
        return *(--it);
    }

    typename Iterator::Pointer operator->()
    {
        return &(operator*());
    }

    __ReverseIterator operator++()
    {
        --_it;
        return *this;
    }

    __ReverseIterator operator--()
    {
        ++_it;

        return *this;
    }

    bool operator != (__ReverseIterator<Iterator>& s)
    {
        return _it != s._it;
    }

    bool operator == (__ReverseIterator<Iterator>& s)
    {
        return _it == s._it;
    }
};

测试代码见下:

template <class T>
void Print(List<T>& l)
{
    List<int>::Iterator it1 = l.Begin();
    while (it1 != l.End())
    {
        cout << *it1 << " ";
        it1++;
    }
    cout << endl;
}

template <class T>
void PrintConst(const List<T>& l)
{
    List<int>::ConstIterator it1 = l.Begin();
    List<int>::ConstIterator it2 = l.End();
    while (it1 != l.End())
    {
        cout << *it1 << " ";
        it1++;
    }
    cout << endl;
}

void MyListTest()
{
    List<int> l;
    l.PushBack(1);
    l.PushBack(2);
    l.PushBack(3);
    l.PushBack(4);
    Print(l);

    // ReverseIterator 测试
    List<int>::ReverseIterator rIt = l.rBegin();
    while (rIt != l.rEnd())
    {
        cout << *rIt << " ";
        ++rIt;
    }
    cout << endl;

    // ConstIterator 测试
    List<int> l1;
    l1.PushBack(1);
    l1.PushBack(2);
    l1.PushBack(3);
    l1.PushBack(4);
    PrintConst(l1); 

    List<int>::Iterator it1 = l.Begin();
    l.Insert(it1, 0);
    Print(l);
    l.PushFront(-1);
    Print(l);
    List<int>::Iterator it2 = l.Begin();
    l.Erase(it2);
    Print(l);
}

int main()
{
    MyListTest();
    system("pause");
    return 0;
}

程序运行结果如下:
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值