用迭代器实现list的各种功能
2016-10-11 15:46
239 查看
<span style="font-size:24px;">#include<iostream> #include<cstdlib> #include<list> #include<cassert> using namespace std; template<class T> struct _ListNode { _ListNode* _prev; _ListNode* _next; T _data; _ListNode(const T& x) :_data(x) ,_prev(0) ,_next(0) {} }; template<class T,class Ref,class Ptr> //<T,T&,T*> struct _ListIterator { typedef _ListNode<T> Node; typedef _ListIterator<T,Ref,Ptr> Self; _ListIterator() {} _ListIterator(Node* node) :_node(node) {} Ref operator*() { return _node->_data ; } Ptr operator->() //p->a==(*p).a { return _node; //返回地址 } bool operator==(const Self& s) { return _node ==s._node ; } bool operator!=(const Self& s) { return _node!=s._node ; } Self& operator++() //前置++ { _node=_node->_next; return *this; } Self operator++(int) { Self tmp(_node); _node=_node->_next ; return tmp; } Self& operator--() { _node=_node->_prev ; return *this; } Self operator--(int) { Self tmp(_node); _node=_node->_prev ; return tmp; } Node* _node; }; //双向循环列表 template<class T> class List { public: typedef _ListNode<T> Node; typedef _ListIterator<T,T&,T*> Iterator; Node* BuyNode(const T& x) { Node* node=new Node(x); return node; } List() { _head=BuyNode(T()); //创建一个头节点 _head->_next =_head; _head->_prev =_head; } void PushBack(const T& x) { //这个是用普通方法实现的 /*Node* tail=_head->_prev ; Node* tmp=BuyNode(x); tail->_next =tmp; tmp->_prev =tail; tmp->_next =_head; _head->_prev =tmp;*/ //这个是用迭代器实现的 Insert(End(),x); } void PopBack() { Erase(--End()); } void PushFront(const T& x) { Insert(Begin(),x); } void PopFront() { Erase(Begin()); } void Insert(Iterator pos,const T& x) //在pos之前插入 { Node* tmp=BuyNode(x); Node* cur=pos._node ->_prev ; cur->_next =tmp; tmp->_prev =cur; tmp->_next =pos._node ; pos._node ->_prev =tmp; } void Erase(Iterator pos) { assert(pos!=End()); Node* node=pos._node ; if(pos._node ->_next ==_head) { ++pos; } ++pos; Node* prev=node->_prev ; Node* next=node->_next ; prev->_next =next; next->_prev =prev; delete node ; } Iterator Begin() //[ { return Iterator(_head->_next ); } Iterator End() //) { return Iterator(_head); } private: Node* _head; }; int main() { /*list<int> l; l.push_back (1); l.push_back (2); l.push_back (3); l.push_back (4); list<int>::iterator it=l.begin (); while(it!=l.end()) { cout<<*it<<" "; ++it; }*/ //i调用了匿名对象 //int i=int(); //i=0 //int i=int(2); //i=2 //int j=9; //cout<<i<<endl; //cout<<j<<endl; List<int> l; l.PushBack (1); l.PushBack (2); l.PushBack (3); l.PushBack (4); /*l.PushFront (1); l.PushFront (2); l.PushFront (3); l.PushFront (4);*/ l.PopFront (); //l.PopBack (); List<int>::Iterator it=l.Begin(); while(it!=l.End()) { cout<<*it<<" "; ++it; } cout<<endl; system("pause"); return 0; }</span>
相关文章推荐
- 【C++/STL】list的实现(没有采用迭代器和空间配置器所实现的双向链表的基本功能)
- 用list自带的迭代器,实现边遍历边添加的功能
- 关于DevExpress.XtraTreeList.TreeList控件的使用——给TreeList添加RepositoryItem以实现文本编辑功能
- ArrayList和LinkedList的区别是什么?举例说明LinkedList可实现的功能
- C#泛型列表List实现二维数组的功能(令附C#泛型列表List基本用法总结)
- Flex 4 List Data Paging(Flex 4 List控件分页功能的实现)
- [Wap] 制作自定义WmlListAdapter来实现Mobile.List控件的各种效果
- List<T> 排序(Sort)查找(Find)功能的多种实现
- 实现CheckBoxList的ToolTip的功能
- ArrayList和LinkedList的区别是什么?举例说明LinkedList可实现的功能
- .NET泛型List实现快速排序、查找功能
- J2EE 0.7.1—报表功能。传入封装数据的list实现打印标签报表。。
- [Wap] 制作自定义WmlListAdapter来实现Mobile.List控件的各种效果
- 在VB中实现PickList功能
- 在VB中实现PickList功能
- Gridview各种功能+AspNetPager+Ajax实现无刷新存储过程分页
- [Wap] 制作自定义WmlListAdapter来实现Mobile.List控件的各种效果
- 在VB中实现PickList功能
- Gridview各种功能+AspNetPager+Ajax实现无刷新存储过程分页
- TreeList控件实现数据过滤功能