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

原创 2015年07月10日 18:56:57
<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语言实现面向对象风格带迭代器的双向链表

首先看main函数中双向链表的用法: #include #include #include "dlist.h" int main(void) { LinkedList* list = ne...

STL之双向链表及其迭代器简单实现

最近在看STL,试着写一个自己的链表模板,与STL相比没有使用空间配置器,方法也只实现了几个简单的插入删除元素。但是理清了容器、迭代器之间的关系。代码及测试用例如下。list_test.h文件 # i...

我是如何成为一名python大咖的?

人生苦短,都说必须python,那么我分享下我是如何从小白成为Python资深开发者的吧。2014年我大学刚毕业..

搜索二叉树实现->迭代器实现->转化为双向链表

二叉搜索树

【STL】list迭代器的模拟实现

一:list: list 简单点说就是c++标准库(STL)的一种容器,可以实现插入和删除的操作,实质和双向链表相同,但这个双向链表时带有头结点的双向链表。 二:迭代器  迭代器(iterato...

【STL】迭代器与List的模拟实现

什么是List List是STL库(标准模板库)中的一个容器。它的实质上就是一个双向链表,而且要注意的是,这个双向链表是有头的; 这样的设计是STL中一个很巧妙的地方, 它解决了: (1)插入数据时的...

C++ STL入门教程(2)——list(双向链表)的使用(附完整程序代码)

一、简介 “Unlike other standard sequence containers, list and forward_list objects are specifically...

C++ STL入门教程(2)——list(双向链表)的使用(附完整程序代码)

一、简介 Lists将元素按顺序储存在链表中。与向量(vector)相比, 它允许快速的插入和删除,但是随机访问却比较慢。(vector支持快速随机访问) 在前一篇就提到过,list可以在头部进行添加...

C++ STL 容器技术 之 list双向链表容器

转载自:http://hi.baidu.com/xuehuo_0411/blog/item/6993c7084a8987a12fddd42f.html 简介: list是双向链表的一个泛化容器...
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)