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


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

版权声明:本文为博主原创文章,未经博主允许不得转载。

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

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

浅谈STL list<T>链表容器和迭代器的使用C++实现

一、今天简单的实现了STL容器里面的顺序容器list双链表里面的简单应用和迭代器的简单实现方法    包括迭代器的重载方法     二、双向链表的实现需要了解 堆得内存分配问题。堆内存是开发者使用ne...
  • whisperfor
  • whisperfor
  • 2017年05月26日 21:46
  • 349

STL 之 list 双向链表

list 介绍 list 是双向链表的一个泛化容器,它的数据元素可通过链表指针串接成逻辑意义上的线性表。不同于采用线性表顺序存储结构的vector 和 deque 容器,list 双向链表中任一位置的...
  • xunmengpiaoyun
  • xunmengpiaoyun
  • 2013年12月23日 15:33
  • 1538

一步一步写STL:空间配置器 (1)

侯捷说:追踪一流程序,并从中吸取养分,模仿着他写的程序,比那些自以为靠自己努力写出来的下三流程序价值高得多,至少我这么认为——世界上99.999%的程序,在STL面前都是下三流水平!   侯捷老师...
  • effective_coder
  • effective_coder
  • 2013年05月30日 02:01
  • 6057

STL 之双向迭代器

目录 作用:既可以向后访问元素
  • haifengzhilian
  • haifengzhilian
  • 2014年04月13日 12:36
  • 1965

C++标准模板库(STL)迭代器的原理与实现

迭代器(iterator)是一种抽象的设计理念,本文探讨了迭代器的作用与原理,实现了简单的迭代器,并采用trait编程技巧编写了简单算法验证。...
  • wutao1530663
  • wutao1530663
  • 2017年03月22日 19:18
  • 2067

STL 之 list源代码自行实现(iterator)

一:起因 (1)数据结构里面两种非常重要的存储结构,线性结构中的连续存储结构(代表vector数组)和非连续存储结构(代表list链表),他们两者被广泛的应用在 各个领域,是最基本最基础的两种存储结构...
  • u010700335
  • u010700335
  • 2014年11月17日 20:24
  • 3262

C语言实现面向对象风格带迭代器的双向链表

首先看main函数中双向链表的用法: #include #include #include "dlist.h" int main(void) { LinkedList* list = ne...
  • jb_peng
  • jb_peng
  • 2016年05月26日 20:24
  • 510

STL 中 链表(双向链表)和迭代器(iterator)的使用

//STL 中 链表(双向链表)和迭代器的使用 ,,迭代器就理解成指向元素的指针 #include #include using namespace std; void ListUsag...
  • daa20
  • daa20
  • 2015年12月28日 20:55
  • 734

【C++/STL】list的实现(采用空间配置器和迭代器)

在list库函数的编译中仍然有很多问题,在源代码的编译中有些内容尚未搞懂,在后期的学习中会进行更加深入的学习,希望大家可以对我的问题提出建议和批评,谢谢大家~        具体的代码如下:   ...
  • qaz3171210
  • qaz3171210
  • 2015年07月13日 20:04
  • 515
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【C++/STL】list的实现(没有采用迭代器和空间配置器所实现的双向链表的基本功能)
举报原因:
原因补充:

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