实现基于迭代器的链表(泛型)
来源:互联网 发布:搜狗输入法下载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
- 实现基于迭代器的链表(泛型)
- 基于链表的栈实现(c++)
- 基于链表的栈实现(c++)
- 简单栈的实现(基于链表)
- 简单队列的实现(基于链表)
- 简单列表的实现(基于链表)
- 简单列表的实现(基于双向链表)
- 链表的实现基于C++
- 基于升序链表的定时器实现
- 基于链表的队列实现
- 基于链表的堆栈实现
- 基于连续存储空间的链表实现
- 基于Java的链表实现
- 基于链表的栈实现
- 基于链表的队列实现
- 基于链表的列表实现
- 模板容器类及迭代器的实现二(基于链表)
- 数据结构和算法C语言实现:链表的实现(基于动态内存分配)
- spring batch job 详细配置以及多个job时如何根据参数执行指定job
- Field-Driven与ModelDriver
- 使用JNIEnv全局变量调用FindClass()等函数发生crash
- c+中字符串的相关概念
- 好用的上传下载插件。
- 实现基于迭代器的链表(泛型)
- 《MSSQL2008技术内幕:T-SQL语言基础》读书笔记(下)
- docker初学一
- Dispatcher initialization failed Unable to load configuration
- Android Studio 2.4 Preview(译文)
- 停止线程--异常法
- iOS中runtime运行机制解析
- hibernate之集合映射的属性详细解释
- 【ES6】set和map