【C++/STL】list的实现(没有采用迭代器和空间配置器所实现的双向链表的基本功能)

<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>


此实现仍有很多问题尚未解决,在后期会进行跟进改良,也希望大家指出错误提出建议,谢谢大家~

阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qaz3171210/article/details/46834147
文章标签: C++ STL
个人分类: C++ STL
上一篇【C/C++】文件读写
下一篇【C++/STL】list的实现(采用空间配置器和迭代器)
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭