<span style="font-size:18px;">#include <iostream> using namespace std; //没有采用迭代器和空间配置器所实现的双向链表的基本功能 template<class _Ty> //定义模板类 class list //list类 { public: typedef size_t size_type; //类型重定义 protected: struct _Node; //结构体_Node friend struct _Node; //友元 typedef _Node* _Nodeptr; //类型重定义 struct _Node //结构体定义 { _Nodeptr _Next,_Prev; _Ty _Value; }; protected: _Nodeptr _Head; size_type _Size; public: _Nodeptr _Buynode(_Nodeptr _Narg = 0, _Nodeptr _Parg = 0)//购买结点 { _Nodeptr _S = (_Nodeptr)malloc(sizeof(_Node)); _S->_Next = _Narg != 0 ? _Narg : _S;; _S->_Prev = _Parg != 0 ? _Parg : _S; return (_S); } public: size_type size() const //长度 { return (_Size); } bool empty() const //判空 { return (size() == 0); } explicit list():_Head(_Buynode()), _Size(0) //list无参构造函数 {} explicit list(size_type _N, const _Ty& _V):_Head(_Buynode()), _Size(0) //list构造函数 { insert(_N, _V); } _Nodeptr begin() //第一个节点 { return _Head->_Next; } _Nodeptr end() //头结点 { return _Head; } void insert(_Nodeptr _P,const _Ty& _X) //插入结点 { _Nodeptr _S = _P; _S->_Prev = _Buynode(_S,_S->_Prev); _S = _S->_Prev; _S->_Prev->_Next = _S; _S->_Value = _X; ++_Size; } void insert(size_type _M, const _Ty& _X) //插入_M个_X结点 { for(;0 < _M;--_M) { insert(begin(),_X); } } void push_front(const _Ty& _X) //头插 { insert(begin(), _X); } void pop_front() //头删 { erase(begin()); } void push_back(const _Ty& _X) //尾插 { insert(end(), _X); } void pop_back() //尾删 { erase(end()->_Prev); } void assign(size_type _N, const _Ty& _X) //重新插入 { clear(); insert(_N, _X); } _Nodeptr erase(_Nodeptr _P) //删除结点 { _Nodeptr _S = _P++; _S->_Prev->_Next = _S->_Next; _S->_Next->_Prev = _S->_Prev; free(_S); --_Size; return (_P); } void clear() //清除 { _Nodeptr _P = _Head->_Next; while(_P != _Head) { _Head->_Next = _P->_Next; _P->_Next->_Prev = _P->_Prev; free(_P); _P = _Head->_Next; } _Head->_Next = _Head->_Prev; _Size = 0; } void show() //打印 { _Nodeptr _P = _Head->_Next; while(_P != _Head) { cout<<_P->_Value<<"-->"; _P = _P->_Next; } cout<<"Over"<<endl; } ~list() //析构函数 { clear(); free(_Head); _Head = 0, _Size = 0; } }; void main() { list<int> mylist(5,1); mylist.show(); mylist.insert(2,4); mylist.show(); mylist.push_front(3); mylist.show(); mylist.push_back(4); mylist.show(); mylist.pop_front(); mylist.show(); mylist.pop_back(); mylist.show(); mylist.clear(); mylist.show(); mylist.assign(2,3); mylist.show(); }</span>
此实现仍有很多问题尚未解决,在后期会进行跟进改良,也希望大家指出错误提出建议,谢谢大家~
版权声明:本文为博主原创文章,未经博主允许不得转载。
【C++/STL】list的实现(没有采用迭代器和空间配置器所实现的双向链表的基本功能)
原文地址:http://blog.csdn.net/qaz3171210/article/details/46834147