简单实现c++数组,链表及其迭代器

#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<time.h>

using namespace std;

template<class T>
class MyArray {
private:
    int m_nTotalSize;
    int m_nValidSize;
    T* m_pData;
public:
    class Iterator {
        T* t;
    public:
        Iterator(T* t)
        {
            this->t = t;
        }
        bool operator!=(Iterator it)
        {
            return this->t != it.t;
        }
        void operator++(int)
        {
            this->t++;
        }
        T operator*()
        {
            return *this->t;
        }
    };

    MyArray(int nSize = 3) {
        m_pData = new T[nSize];
        m_nTotalSize = nSize;
        m_nValidSize = 0;
    }
    void Add(T value) {
        int i;
        if (m_nValidSize < m_nTotalSize) {
            m_pData[m_nValidSize] = value;
            m_nValidSize++;
        }
        else {
            T* tempData = new T[m_nTotalSize];
            for (i = 0;i < m_nTotalSize;i++) {
                tempData[i] = m_pData[i];
            }
            delete[]m_pData;
            m_nTotalSize *= 2;
            m_pData = new T[m_nTotalSize];
            for (i = 0;i < m_nValidSize;i++) {
                m_pData[i] = tempData[i];
            }
            delete[]tempData;
            m_pData[m_nValidSize] = value;
            m_nValidSize++;
        }
    }
    int GetSize() {
        return m_nValidSize;
    }
    T Get(int pos) {
        return m_pData[pos];
    }

    T* Begin()
    {
        return m_pData;
    }

    T* End()
    {
        return m_pData + m_nValidSize;
    }


    virtual ~MyArray() {
        if (m_pData != NULL) {
            delete[]m_pData;
            m_pData = NULL;
        }
    }
};


template <class T>
class MyLink {
public:
    struct Unit
    {
        T value;
        Unit* next;

    };

    friend ostream& operator<<(ostream &os, Unit &unit)
    {
        os << unit.value;
        return os;
    }

    class Iterator {
        Unit* init;
    public:
        Iterator(Unit* init) {
            this->init = init;
        }
        bool operator!=(Iterator& it) {
            return this->init != it.init;
        }
        void operator++(int) {
            init = init->next;
        }
        Unit operator*() {
            return *init;
        }
    };

    Unit* head;
    Unit* tail;
    Unit* prev;
public:
    MyLink() {
        head = tail = prev = NULL;
    }

    void Add(T value) {
        Unit* u = new Unit();
        u->value = value;
        u->next = NULL;
        if (head == NULL) {
            head = u;
            prev = u;
        }
        else {
            prev->next = u;
            prev = u;
        }
        tail = u->next;
    }

    Unit* Begin()
    {
        return head;
    }
    Unit* End() {
        return tail;
    }

    virtual ~MyLink() {
        Unit* prev = head;
        Unit* next = NULL;
        if (head != NULL) {
            while (prev != tail)
            {
                next = prev->next;
                delete prev;
                prev = next;
            }
        }
    }
};

template <class Init>
void display(Init start, Init end) {
    cout << endl;
    for (Init mid = start;mid != end;mid++) {
        cout << *mid << "\t";
    }
    cout << endl;
}

int main() {
    int i;
    MyArray<int> MyArr;
    MyLink<int> MyLnk;
    srand(static_cast<unsigned int>(time(NULL)));
    for (i = 0;i < 5;i++)
    {
        MyLnk.Add(rand());
    }
    MyLink<int>::Iterator start = MyLnk.Begin();
    MyLink<int>::Iterator end = MyLnk.End();
    display(start, end);

    srand(static_cast<unsigned int>(time(NULL)));
    for (i = 0;i < 5;i++)
    {
        MyArr.Add(rand());
    }
    MyArray<int>::Iterator start1 = MyArr.Begin();
    MyArray<int>::Iterator end1 = MyArr.End();
    display(start1, end1);
    system("pause");
    return 0;
}
  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值