实现基于迭代器的链表(泛型)

来源:互联网 发布:搜狗输入法下载centos 编辑:程序博客网 时间:2024/06/18 04:50
#include <iostream>#include <functional>template <class T>class Node{public:    T data;    Node<T> *next;    Node(T t)    {        data=t;        next=NULL;    }};class My_predicate{public:    bool operator()(int &a)    {        return a>2;    }};template <class T>class Forward_list{public:    class iterator    {    public:        iterator(Node<T>* p)        {            node=p;        }        T operator*()const        {            return node->data;        }        Node<T>* operator->()        {            return node;        }        //前置重载++,最好判断下,避免++A造成错误        iterator& operator++()        {            if(node!=NULL)                node=node->next;            return *this;        }        //后置重载++,不能返回局部变量引用        iterator operator++(int)        {            iterator ite = *this;            ++(*this);            return ite;        }        bool operator!=(const iterator p)        {            return node!=p.node;        }    private:        Node<T> *node;    };    Forward_list();    iterator begin()    {        return iterator(head);   //返回迭代器    }    iterator end()    {        return iterator(NULL);   //返回迭代器尾,直接创建内容为空的迭代器    }    void push_front(Node<T>* node);//头插一个节点    void pop_front();//删去第一个节点    void insert_after(Node<T>* node);//尾插一个节点    void erase_after();//删去最后一个节点    int size();//返回节点个数    void clear();//清空链表    bool empty();//判断链表是否为空    void remove(const T& value);//删除t    template<class UnaryPredicate>    void remove_if(const UnaryPredicate p);//对满足predicate条件的节点 进行删除    void reverse();//反转链表    void merge(iterator begin,iterator end);//合并链表private:    Node<T> *head;    Node<T> *last;};//初始化为空template <class T>Forward_list<T>::Forward_list(){    head=NULL;    last=NULL;}//向头部插入节点template <class T>void Forward_list<T>::push_front(Node<T>* node){    if(last==NULL)//如果没有尾节点,尾指针指向新增节点        last=node;    node->next=head;    head=node;}//当链表不为空时删除头部节点template <class T>void Forward_list<T>::pop_front(){    if(!this->empty())    {        Node <T>*p=head;        if(head->next==NULL)            last=NULL;        head=head->next;        delete p;    }}//在尾部插入节点,若链表为空 头节点也要更新template <class T>void Forward_list<T>::insert_after(Node<T>* node){    if(!this->empty())        last->next=node;    else        head=node;    last=node;}//删除最后一个节点template <class T>void Forward_list<T>::erase_after(){    if(!this->empty())    {        Node<T> *node=head;        while(node->next!=last)            node=node->next;        delete last;        last=node;        last->next=NULL;    }}//返回节点个数template <class T>int Forward_list<T>::size(){    int count=0;    Node<T>*p=head;    while(p!=NULL)    {        p=p->next;        count++;    }    return count;}//清空链表template <class T>void Forward_list<T>::clear(){    while(head != NULL)    {        Node <T>*p=head;        head=head->next;        delete p;    }    last=NULL;}//判断链表是否为空template <class T>bool Forward_list<T>::empty(){    return head == NULL;}//反转链表template <class T>void Forward_list<T>::reverse(){    Node <T>*p=NULL;    Node <T>*q=head;    last=head;    while(q!=NULL)    {        Node <T>*temp=q->next;        q->next=p;        p=q;        q=temp;    }    head=p;}template <class T>void Forward_list<T>::remove(const T& value){    if(!this->empty())    {        Node<T> *q=head;        Node<T> *pre=NULL;        while(q)        {            if(q->data==value)            {                if(pre==NULL)//当前节点为第一个结点                {                    this->pop_front();                    q=head;                }                else                {                    pre->next=q->next;                    delete q;                    q=pre->next;                }            }            else//没有找到时 继续            {                pre=q;                q=q->next;            }        }    }}template<class T>template<class UnaryPredicate>void Forward_list<T>::remove_if(UnaryPredicate p){    if(!this->empty())    {        Node<T> *q=head;        Node<T> *pre=NULL;        while(q)        {            if(p(q->data))            {                if(pre==NULL)//当前节点为第一个结点                {                    head=head->next;                    delete q;                    q=head;                }                else                {                    pre->next=q->next;                    delete q;                    q=pre->next;                }            }            else//没有找到时 继续            {                pre=q;                q=q->next;            }        }    }}//合并链表template<class T>void  Forward_list<T>::merge(iterator begin,iterator end){    Node<T> *q=head;    Node<T> *before;    while(begin!=end&&q!=NULL)    {        if(q->data>=*begin) //插入 begin 后移        {            Node<T> *temp=new Node<T>(*begin);            temp->next=q;            before->next=temp;            ++begin;        }        else  //q 后移        {            before = q;            q=q->next;        }    }    while(begin!=end)//没有合并的结点,都插入当前链表尾部    {        this->insert_after(new Node<T>(*begin));        ++begin;    }}//test *itr and itr++template <class T>void travers(Forward_list<T> list){    if(list.empty())    {        std::cout<<"No value contains"<<std::endl;    }    else    {        Forward_list<int>::iterator itr=list.begin();        for(; itr!=list.end(); itr++)        {            std::cout<< *itr <<" ";        }        std::cout<< std::endl;        std::cout<< std::endl;    }}int main(){    Forward_list<int> list;    //test push front    std::cout<< "test push front" << std::endl;    for(int i=0; i<10; i++)    {        list.push_front(new Node<int>(i));    }    std::cout<<"list1: ";    travers(list);//4 3 2 1 0    //test pop_front    std::cout<< "test pop_front" << std::endl;    list.pop_front();    travers(list);//3 2 1 0    //test insert_after    std::cout<< "test insert_after 5" << std::endl;    list.insert_after(new Node<int>(5));    travers(list);//3 2 1 0 5    //test erase_after    std::cout<< "test erase_after" << std::endl;    list.erase_after();    travers(list);//3 2 1 0    std::cout<< "test size" << std::endl;    std::cout<< list.size() << std::endl;//4    list.reverse();    std::cout<< "test reverse 反转后" << std::endl;    std::cout<<"list1: ";    travers(list);//0 1 2 3    //merge    Forward_list<int> list2;    for(int i=5; i<15; i++)    {        list2.insert_after(new Node<int>(i));    }    std::cout<<"list2: ";    travers(list2);    std::cout<<"merge"<<std::endl;    list.merge(list2.begin(),list2.end());    travers(list);    //test remove    std::cout<< "test remove 5" << std::endl;    list.remove(5);    travers(list);//0 1 3    list.insert_after(new Node<int>(5));    list.insert_after(new Node<int>(6));    //test remove_if    std::cout<< "test remove_if value>2" << std::endl;    list.remove_if(My_predicate());//删除比2大的数    travers(list);//0 1    //test clear    std::cout<< "test clear" << std::endl;    list.clear();    travers(list);//"No value contains"    return 0;}

 


sort函数没有实现,遇到一些问题
原本准备用归并排序,调用merge函数来写

等询问过大神再更新吧。。。。。

0 0