迭代器的使用之双向循环链表
来源:互联网 发布:公钥密码算法 编辑:程序博客网 时间:2024/06/06 19:36
模拟实现迭代器和用迭代器的方式实现双向循环链表
什仫是迭代器?>
迭代器是一个抽象的设计概念,它的定义为:提供一种方法,使之能够依序巡访某个容器所含的各个元素,而又无需暴露该聚合物的内部表述方式.
迭代器的设计思维>
将数据容器和算法分开,彼此独立设计,最后再以一帖胶着剂将他们撮合在一起.
迭代器到底是什仫呢?>
迭代器是类似智能指针的对象,在实现中我们可以想当然的把它看作一个指针对象而已.下面是智能指针的一点介绍:
http://blog.csdn.net/qq_34328833/article/details/52432418
--------------------------------------------
双向循环链表>
将双链表的终端结点的后继指针域由空指针改为指向头结点,而头结点的前驱指针域指向的则是终端结点,这种头尾相接的双链表称为双向循环链表.
双向循环链表的插入和删除>
-------------------------------------
下面就让我们开始造轮子
模拟实现一个简单的迭代器:
template<class T,class Ref,class Ptr>struct Iterator{typedef LinkNode<T> Node;typedef Iterator<T,Ref,Ptr> Sef;Iterator(Node *node):_node(node){}Iterator() //默认的构造函数{}bool operator == (const Sef& s)const{return _node == s._node;}bool operator != (const Sef& s)const{return _node != s._node;}Ref operator*(){return _node->_data;}Ptr operator->(){return _node;}Sef& operator++() //前置++{_node=_node->_next;return *this;}Sef operator++(int) //后置++{Sef tmp(*this);_node=_node->_next;return tmp;}Sef& operator--() //前置--{_node=_node->_prev;return *this;}Sef operator--(int) //后置--{Sef tmp(*this);_node=_node->_prev;return tmp;}Node *_node;};
模拟实现双向循环链表:
#pragma once#include<iostream>#include<cassert>using namespace std;template<class T>struct LinkNode{LinkNode<T> *_next;LinkNode<T> *_prev;T _data;LinkNode(const T& x):_data(x),_next(NULL),_prev(NULL){}};template<class T,class Ref,class Ptr>struct Iterator{typedef LinkNode<T> Node;typedef Iterator<T,Ref,Ptr> Sef;Iterator(Node *node):_node(node){}Iterator() //默认的构造函数{}bool operator == (const Sef& s)const{return _node == s._node;}bool operator != (const Sef& s)const{return _node != s._node;}Ref operator*(){return _node->_data;}Ptr operator->(){return _node;}Sef& operator++() //前置++{_node=_node->_next;return *this;}Sef operator++(int) //后置++{Sef tmp(*this);_node=_node->_next;return tmp;}Sef& operator--() //前置--{_node=_node->_prev;return *this;}Sef operator--(int) //后置--{Sef tmp(*this);_node=_node->_prev;return tmp;}Node *_node;};template<class T>class LinkList{typedef LinkNode<T> Node;public:typedef Iterator<T,T&,T*> LinkIterator;LinkList(){_head=CreatNode(T()); //传默认参数_head->_next=_head; //设置哨兵_head->_prev=_head;}LinkList(const LinkList<T>& l){_head=CreatNode(T());_head->_next=_head;_head->_prev=_head;Node *cur=l._head->_next;while(cur != l._head){Insert(End(),cur->_data);cur=cur->_next;}}LinkList<T>& operator=(LinkList<T> l){std::swap(_head,l._head);return *this;}~LinkList(){Node *cur=_head->_next;while(cur != _head){Node *del=cur;cur=cur->_next;delete del;del=NULL;}delete _head;}public://void PushBack(const T& x)//{//Node *tail=_head->_prev;//Node *NewNode=CreatNode(x);//tail->_next=NewNode;//NewNode->_prev=tail;//NewNode->_next=_head;//_head->_prev=NewNode;//}void PushBack(const T& x){Insert(End(),x);}void PushFront(const T& x){Insert(Begin(),x);}void PopBack(){Erase(--End());}void PopFront(){Erase(Begin());}void Insert(LinkIterator pos,const T& x) //在指定位置前插{Node *cur=pos._node;Node *prev=cur->_prev;Node *NewNode=CreatNode(x);NewNode->_next=cur;cur->_prev=NewNode;prev->_next=NewNode;NewNode->_prev=prev;}void Erase(LinkIterator pos){assert(pos != End()); //删除的不是哨兵Node *del=pos._node;del->_prev->_next=del->_next;del->_next->_prev=del->_prev;delete del;del=NULL;}LinkIterator Begin(){return LinkIterator(_head->_next);}LinkIterator End(){return LinkIterator(_head);}protected:Node* CreatNode(const T& x){Node *NewNode=new Node(x);return NewNode;}protected:Node* _head;};
测试代码:
void testIterator(){LinkList<int> l;for(int i=0;i<10;i++){l.PushBack(i+1);}LinkList<int>::LinkIterator it=l.Begin();while(it != l.End()){cout<<*it<<" ";++it;}cout<<endl;for(int i=0;i<10;i++){l.PopBack();}LinkList<int>::LinkIterator it1=l.Begin();while(it1 != l.End()){cout<<*it1<<" ";++it1;}cout<<endl;}void test1(){LinkList<int> l1;for(int i=0;i<10;i++){l1.PushFront(i+1);}LinkList<int>::LinkIterator it=l1.Begin();while(it != l1.End()){cout<<*it<<" ";++it;}cout<<endl;for(int i=0;i<10;i++){l1.PopFront();}LinkList<int>::LinkIterator it1=l1.Begin();while(it1 != l1.End()){cout<<*it1<<" ";++it1;}cout<<endl;}void test2(){LinkList<int> l1;l1.PushBack(1);l1.PushBack(2);l1.PushBack(3);l1.PushBack(4);LinkList<int>::LinkIterator it=l1.Begin();while(it != l1.End()){cout<<*it<<" ";++it;}cout<<endl;//1 2 3 4LinkList<int> l2(l1);l2.PushBack(5);LinkList<int>::LinkIterator it1=l2.Begin();while(it1 != l2.End()){cout<<*it1<<" ";++it1;}cout<<endl;//1 2 3 4 5l1=l2;LinkList<int>::LinkIterator it2=l1.Begin();while(it2 != l1.End()){cout<<*it2<<" ";++it2;}cout<<endl;//1 2 3 4 5}
-------------------------------------
对于迭代器的理解和简单模拟就结束了....
0 0
- 迭代器的使用之双向循环链表
- 内置迭代器的双向循环链表
- 数据结构示例之带头节点的双向循环链表
- 数据结构示例之带头节点的双向循环链表
- 数据结构之——循环双向链表的实现
- std::list(双向循环链表)的使用?
- 线性表之双向循环链表
- 程序员成长之双向循环链表
- 数据结构之双向循环链表06
- 内核双向循环链表之旅
- 内核双向循环链表之旅
- 数据结构之双向循环链表
- 数据结构之双向循环链表
- 数据结构之双向循环链表
- 内核数据结构之双向循环链表
- 双向循环链表之实践
- 数据结构之双向循环链表
- 数据结构之双向循环链表
- Linux集群时间同步设置
- JAVA反射系列之Field,java.lang.reflect.Field使用获取方法。
- 最长单增子序列-动态规划
- 一些基本形态学算法------区域填充算法
- Docker基础: Linux内核命名空间之(3)net namespace
- 迭代器的使用之双向循环链表
- Linux下Nagios的安装与配置
- linux后台运行和关闭、查看后台任务
- System类
- 理解EJB
- POJ 2778 DNA Sequence AC自动机+矩阵优化 *
- Linux下Samba服务的搭建
- HDU 2795 单点更新 + 区间最值
- Android 6.0 运行时权限处理