模板链表 内有迭代器(代码)

#pragma once

#include "stdafx.h"
#include "MyList.h"
#include <exception>
using namespace std;


template<typename T>
class CMyList
{
private:
    //结点
    struct MyNode
    {
        MyNode(T nVal) :m_nData(nVal) {   }
        T m_nData;
        MyNode* m_pPreNode = nullptr; //前驱结点指针
        MyNode* m_pNextNode = nullptr; //后继结点指针
    };
public:
    /** 迭代器 **/
    /************************************************************************************************/
    class Iterator
    {
        friend class CMyList;
    public:
        Iterator(MyNode* pos) :m_pos(pos)
        {
        }
        Iterator& operator++() //前++
        {
            /*
            *    m_pos
                  \|/
            *    2 3 4 
              ++操作,从当前节点3的位置,向后移,即移动到3的后继结点4
            *      m_pos
                    \|/
            *    2 3 4
            */
            m_pos = m_pos->m_pNextNode;
            return *this;
        }
        Iterator operator++(int) //后++
        {
            m_pos = m_pos->m_pNextNode;
            return Iterator(m_pos->m_pPreNode);
        }
        Iterator& operator--()//前--
        {
            m_pos = m_pos->m_pPreNode;
            return *this;
        }
        Iterator operator--(int)
        {
            m_pos = m_pos->m_pPreNode;
            return Iterator(m_pos->m_pNextNode);
        }
        bool operator==(Iterator& itr)
        {
            return (m_pos == itr.m_pos);
        }
        bool operator!=(Iterator& itr)
        {
            return !(*this == itr);
        }
        T& operator*()
        {
            return m_pos->m_nData;
        }
        //这里有问题,int不能用
        T* operator->()
        {
            return &m_pos->m_nData;
        }
    private:
        MyNode* m_pos = nullptr; //元素位置
    };
    /**********************************************************************************************************/
public:
    Iterator begin(); //返回指向第一个元素的迭代器
    Iterator end();//返回指向最后一个元素后面位置的迭代器

public:
    CMyList();
    ~CMyList();

public:
    /*  增加  */
    void push_front(const T& nVal);  //头部插入数据
    void push_back(const T& nVal);    //尾部插入数据
    void insert(Iterator itr, const T& nVal); //指定位置插入数据


    /*  删除  */
    void pop_front(); //删除头结点
    void pop_back(); //删除尾结点
    void erase(Iterator itr); //删除指定位置的节点


    /* 访问 */
    T& front(); //访问头结点
    T& back();  //访问尾结点


    /* 其它 */
    int size(); //获取链表中元素的个数
    void clear(); //清空链表
    /*从小排序*/
    void BeforSmallsort();
    /*从大排序*/
    void BeforBigsort();

    bool Empty();

private:
    MyNode* m_pHeadNode = new MyNode(0); //头结点哨兵
    MyNode* m_pTailNode = new MyNode(0); //头结点哨兵
};

/*******************************************************************************************************/
// MyList.cpp : 定义控制台应用程序的入口点。

template<typename T>
int CMyList<T>::size()
{
    int i = 0;
    MyNode* pA = m_pHeadNode->m_pNextNode;
    while (pA != m_pTailNode)
    {
        i++;
        pA = pA->m_pNextNode;
    }
    return i;
}

    /*从小排序*/
template<typename T>
void CMyList<T>::BeforSmallsort()
{
    MyNode *PA = m_pHeadNode;

    MyNode *PB = PA->m_pNextNode;

    if (PA->m_pNextNode == m_pTailNode || PB->m_pNextNode == m_pTailNode)
    {
        return;
    }
    int size = this->size();
    for (int i = 0; i < size - 1; i++)
    {
        PA = PA->m_pNextNode;

        PB = PA->m_pNextNode;
        while (PB != m_pTailNode)
        {
            if (PA->m_nData > PB->m_nData)
            {
                int temp = 0;
                temp = PA->m_nData;
                PA->m_nData = PB->m_nData;
                PB->m_nData = temp;

            }
            PB = PB->m_pNextNode;
        }
    }

}

/*从大排序*/
template<typename T>
void CMyList<T>::BeforBigsort()
{
    MyNode *PA = m_pHeadNode;

    MyNode *PB = PA->m_pNextNode;

    if (PA->m_pNextNode == m_pTailNode || PB ->m_pNextNode == m_pTailNode)
    {
        return;
    }
    int size = this->size();
    for (int i = 0; i < size - 1; i++)
    {

        PA = PA->m_pNextNode;

        PB = PA->m_pNextNode;
        while (PB != m_pTailNode)
        {
            if (PA->m_nData < PB->m_nData)
            {
                int temp = 0;
                temp = PA->m_nData;
                PA->m_nData = PB->m_nData;
                PB->m_nData = temp;

            }
            PB = PB->m_pNextNode;
        }
    }
}




//
template<typename T>
typename CMyList<T>::Iterator CMyList<T>::begin()
{
    return Iterator(m_pHeadNode->m_pNextNode);
}
template<typename T>
typename CMyList<T>::Iterator CMyList<T>::end()
{
    return Iterator(m_pTailNode);
}

template<typename T>
CMyList<T>::CMyList()
{
    //当链表为空的时候,头部哨兵和尾部哨兵互为前驱和后继
    m_pHeadNode->m_pNextNode = m_pTailNode;
    m_pTailNode->m_pPreNode = m_pHeadNode;
}

template<typename T>
CMyList<T>::~CMyList()
{
}

template<typename T>
void CMyList<T>::push_front(const T& nVal)
{
    //创建新结点
    MyNode* pD = new MyNode(nVal);

    /*
       head (0) A  B C (0)

       head (0)[D] A B C (0)
    */ 
    MyNode* pA = m_pHeadNode->m_pNextNode;

    m_pHeadNode->m_pNextNode = pD;
    pA->m_pPreNode = pD;

    pD->m_pPreNode = m_pHeadNode;
    pD->m_pNextNode = pA;
}
template<typename T>
void CMyList<T>::push_back(const T& nVal)
{
    //创建新结点
    MyNode* pD = new MyNode(nVal);
    //遍历获得尾结点
    MyNode* pC = m_pTailNode->m_pPreNode;

    pC->m_pNextNode = pD;
    m_pTailNode->m_pPreNode = pD;

    pD->m_pPreNode = pC;
    pD->m_pNextNode = m_pTailNode;
}
template<typename T>
void CMyList<T>::insert(Iterator itr, const T& nVal)
{
    //创建新结点
    MyNode* pD = new MyNode(nVal);

    /*      D  itr
    head A      B  C
    head A  [D] B  C 
    */
    MyNode* pB = itr.m_pos;  //获取指定位置节点
    MyNode* pA = pB->m_pPreNode; //获取指定位置的前驱结点, 4

    pA->m_pNextNode = pD;

    pB->m_pPreNode = pD;

    pD->m_pPreNode = pA;
    pD->m_pNextNode = pB;
}
template<typename T>
void CMyList<T>::pop_front()
{
    /*
    链表为空,只剩下两个哨兵
    head (0)(0)
    */
    if (m_pHeadNode->m_pNextNode == m_pTailNode)
    {
        return ;
    }

    /*删除A
    head (0) A B (0)
    head (0)   B (0)
    */
    MyNode* pA = m_pHeadNode->m_pNextNode;
    MyNode* pB = pA->m_pNextNode;

    m_pHeadNode->m_pNextNode = pA->m_pNextNode;
    pB->m_pPreNode = m_pHeadNode;

    delete pA;
}
template<typename T>
void CMyList<T>::pop_back()
{
    /*
    链表为空,只剩下两个哨兵
    head (0)(0)
    */
    if (m_pHeadNode->m_pNextNode == m_pTailNode)
    {
        return;
    }

    /*删除B
    head (0) A B (0)
    head (0) A   (0)
    */
    MyNode* pB = m_pTailNode->m_pPreNode;
    MyNode* pA = pB->m_pPreNode;

    m_pTailNode->m_pPreNode = pA;
    pA->m_pNextNode = m_pTailNode;

    delete pB;
}
template<typename T>
void CMyList<T>::erase(Iterator itr)
{
    /*
    * 如果是哨兵,则不删除
    */
    if (itr.m_pos == m_pHeadNode || itr.m_pos == m_pTailNode)
    {
        throw exception("迭代器超出范围");
    }

    /*删除B
    head (0) A B C(0)
    head (0) A   C(0)
    */
    MyNode* pB = itr.m_pos;
    MyNode* pA = pB->m_pPreNode;
    MyNode* pC = pB->m_pNextNode;

    pA->m_pNextNode = pC;
    pC->m_pPreNode = pA;

    delete pB;
}

template<typename T>
T& CMyList<T>::front()
{
    if (Empty())
    {
        throw exception("链表为空");
    }

    return m_pHeadNode->m_pNextNode->m_nData;
}

template<typename T>
T& CMyList<T>::back()
{
    if (Empty())
    {
        throw exception("链表为空");
    }

    return m_pTailNode->m_pPreNode->m_nData;

}



template<typename T>
void CMyList<T>::clear()
{
    while (!Empty())
    {
        pop_front();
    }
}

template<typename T>
bool CMyList<T>::Empty()
{    
    /*
     链表为空,只剩下两个哨兵
     head (0)(0)
     */
    if (m_pHeadNode->m_pNextNode == m_pTailNode)
    {
        return true;
    }
    return false;
}

 

posted @ 2020-09-03 10:57  特权E5  阅读(164)  评论(0编辑  收藏  举报