<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