码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2015-07-10 22:25:43      阅读:148      评论:0      收藏:0      [点我收藏+]

标签:c++   stl   

<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的实现(没有采用迭代器和空间配置器所实现的双向链表的基本功能)

标签:c++   stl   

原文地址:http://blog.csdn.net/qaz3171210/article/details/46834147

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!