欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

list之进阶篇

程序员文章站 2022-04-15 14:11:28
...

自己模拟实现的list

my_list.cpp

#include <stdio.h>
#include <assert.h>
#include <iostream>
using namespace std;


//模拟实现list(双向带头节点链表)


//定义一个List节点
template<class T>
struct ListNode
{
  ListNode *_next;
  ListNode *_prev;
  T _data;
  ListNode(const T & val=T()):_data(val),_next(NULL),_prev(NULL)
  {}
};




template<class T,class Ref ,class Ptr>
struct MyIterator
{
    typedef ListNode<T> Node;
    MyIterator(Node *_Head):_node(_Head)
    {}

    //注意,迭代器只是为了访问容器,这里不能写析构

    //也不需要写拷贝构造,这里需要的是浅拷贝,使用默认的
    Ref operator*()
    {
      return _node->_data;
    }

    Ptr operator->()
    {
      return _node;
    }


    //这里的返回值用迭代器接收是因为,但参数的构造函数支持类型转化
     MyIterator operator++()//前置++
    {
      _node=_node->_next;
      return _node;
    }

     MyIterator operator++(int)//后置++
     {
       Node *tmp=_node;
       _node=_node->_next;
        return tmp;
     }

     MyIterator operator--()//前置--
     {
        _node=_node->_prev;
        return _node;
     }

     MyIterator operator --(int)//后置--
     {
        Node *tmp=_node;
        _node=_node->_prev;
        return tmp;
     }

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

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

    Node *_node;

};

template<class T>
class MyList
{
  public:
    typedef ListNode<T> Node;
    typedef MyIterator<T,T&,T*> Iterator;
    typedef MyIterator<T,const T&,const T*> const_Iterator;

    MyList():_Head(new Node())
  {
    _Head->_next=_Head;
    _Head->_prev=_Head;
  }

    ~MyList()
    { 
      delete _Head;
    }

    Iterator begin()
    {
      return _Head->_next;
    }

    Iterator end()
    {
      return _Head;
    }

    //const版本
    const_Iterator begin()const 
    {
      return const_Iterator(_Head->_next);
    }

    const_Iterator end() const
    {
      return const_Iterator(_Head);
    }

    Iterator Insert(const Iterator& pos,const T & val )
    {
      //这里不用判断pos位置是否合法

      Node *new_node=new Node(val);

      Node *cur=pos._node;//拿出迭代器中的node

      Node *pre=cur->_prev;
      Node *next=cur;
      //pre cur next

      new_node->_next=next;
      next->_prev=new_node;

      pre->_next=new_node;
      new_node->_prev=pre;

      return pos;
    }

    Iterator Erase(const Iterator & pos)
    {
      assert(pos!=Iterator(_Head));
      //这里判断pos位置合法应该是 不为Head就可以
      if(_Head->_next==_Head)
      {
        return Iterator(_Head);
      }

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

      pre->_next=next;
      next->_prev=pre;

      delete cur;
      return Iterator(next);

    }

    void PushFront(const  T& val)
    {
      Insert(begin(),val);
    }

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

    void PushBack(const T & val)
    {
      Insert(--end(),val);
    }

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

  protected:
    Node *_Head;
};

main.cpp

#include "my_list.cpp"


//实现一个打印链表的函数
void PrintList( const MyList<int> &L)
{
  MyList<int> ::const_Iterator it=L.begin();

  while(it!=L.end())
  {
    cout<<*it<<" ";
    it++;
  }

  cout<<endl;
}


void my_list_test()
{
  MyList<int> L;
  L.PushFront(1);
  L.PushFront(2);
  L.PushFront(3);
  L.PushFront(4);
  L.PushFront(5);
  L.PushFront(6);

  printf("头上插入6个元素\n");
  PrintList(L);

  L.PopFront();
  L.PopFront();
  printf("头上删除2个元素\n");
  PrintList(L);

  L.PushBack(7);
  L.PushBack(8);
  L.PushBack(9);
  printf("尾上插入3个元素\n");
  PrintList(L);

  L.PopBack();
  L.PopBack();
  L.PopBack();
  printf("尾上删除3个元素\n");
  PrintList(L);

  L.Insert(L.begin()++,10);
  L.Insert(L.begin()++,11);
  L.Insert(L.begin()++,12);
  printf("在中间插入3个元素\n");
  PrintList(L);

  L.Erase(L.begin()++);
  L.Erase(L.begin()++);
  L.Erase(L.begin()++);
  printf("在中间删除3个元素\n");
  PrintList(L);






}

int main()
{
  my_list_test();
  return 0;

}

list之进阶篇

相关标签: list