list类,模板的操作

以下是总体的解释,代码处都有标识。

首先定义一个模板类 用_Ty, 因为类型不同的类,所以统一用宏定义一些类型名。
构造函数要用显示构造,
针对于节点 写了三个函数操作
定义了三个函数 伺候_Next的三个域 静态函数可以不通过对象调动,通过类名就可以调动
既然已经写了_Acc所以在进行对创建的链表的前后指向操作时,用_Acc来找
购买结点指针
创建一个指针指向开辟的_Node

namespace ghc
{
	template<class _Ty>
	class list
	{
	public:
		typedef size_t size_type;
	public:
		struct _Node;
		typedef _Node* _Nodeptr;
		struct _Node
		{
			_Nodeptr _Next;
			_Nodeptr _Prev;
			_Ty      _Value;
		};
		//针对于节点 写了三个函数操作
		struct _Acc//定义了三个函数 伺候_Next的三个域
		{
			//静态函数可以不通过对象调动,通过类名就可以调动
			typedef _Node*& _Nodepref;//结点指针的引用
			typedef _Ty& _Vref;
			static _Nodepref _Next(_Nodeptr _P)//相当于返回_P所指的后继
			{return _P->_Next;}
			static _Nodepref _Prev(_Nodeptr _P)
			{return _P->_Prev;}
			static _Vref _Value(_Nodeptr _P)
			{return _P->_Value;}
		};
	public:
		explicit list() :_Head(_Buynode()), _Size(0)//构造函数 显示的
		{}
		//相当于下面的代码
		//explicit list()
		//{
		//	_Head = (_Nodeptr)malloc(sizeof(_Node));
		//	_Head->Next = _Head;
		//	_Head->Prev = _Head;
		//	_Size = 0;
		//}
	public:
		void push_back(const _Ty& x)
		{
			_Nodeptr _S = _Buynode(_Head,_Acc::_Prev(_Head));//相当于写了1  2 
										//_Head->Prev;
			_Acc::_Value(_S) = x;// 3
			_Acc::_Next(_Acc::_Prev(_S)) = _S; // 4
			_Acc::_Prev(_Head) = _S; //5
			++_Size;
			//_Nodeptr _S = _Buynode();
			//_S->_Value = x; 3
			//_S->_Next = _Head;  1
			//_S->_Prev = _Head->_Prev;  2
			//_S->_Prev->_Next = _S; 4
			//_Head->_Prev = _S; 5
			//_Size++;
		}
		void push_front(const _Ty& x)
		{
			_Nodeptr _S = _Buynode(_Acc::_Next(_Head), _Head);
			_Acc::_Value(_S) = x;
			_Acc::_Next(_Acc::_Prev(_S)) = _S;
			_Acc::_Prev(_Acc::_Next(_S)) = _S;
			++_Size;
			//_S->_Prev->_Next = _S;
			//_S->_Next->_Prev = _S;
		}
	protected:
		//购买结点指针
		_Nodeptr _Buynode(_Nodeptr _Narg = 0, _Nodeptr _Parg = 0)
		{
			//创建一个指针指向开辟的_Node
			_Node* _S = (_Node*)malloc(sizeof(_Node));
			_Acc::_Next(_S) = _Narg != 0 ? _Narg : _S;
			_Acc::_Prev(_S) = _Parg != 0 ? _Parg : _S;
			//_S的后继不就是_S的_Next()函数么
			//_S->Next = _Narg != 0 ? _Narg : _S;
			//_S->Prev = _Parg != 0 ? _Parg : _S;
			return _S;
		}
	private:
		_Nodeptr _Head;
		size_type _Size;
	};
}

using namespace ghc;
void main()
{
	list<int> mylist;//这个类的类型是整形类
	mylist.push_back(1);
	mylist.push_back(2);
	mylist.push_back(3);
	mylist.push_back(4);

}

希望可以帮到大家。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
面向对象程序设计课程作业 1. 请创建一个数据型为T的链表模板List,实现以下成员函数: 1) 默认构造函数List(),将该链表初始化为一个空链表(10分) 2) 拷贝构造函数List(const List& list),根据一个给定的链表构造当前链表(10分) 3) 析构函数~List(),释放链表中的所有节点(10分) 4) Push_back(T e)函数,往链表最末尾插入一个元素为e的节点(10分) 5) operator<<()友元函数,将链表的所有元素按顺序输出(10分) 6) operator=()函数,实现两个链表的赋值操作(10分) 7) operator+()函数,实现两个链表的连接,A=B+C(10分) 2. 请编写main函数,测试该模板的正确性: 1) 用List模板定义一个List型的模板类对象int_listB,从键盘读入m个整数,调用Push_back函数将这m个整数依次插入到该链表中;(4分) 2) 用List模板定义一个List型的模板类对象int_listC,从键盘读入n个整数,调用Push_back函数将这n个整数依次插入到该链表中;(4分) 3) 用List模板定义一个List型的模板类对象int_listA,调用List的成员函数实现A = B + C;(4分) 4) 用cout直接输出int_listA的所有元素(3分) 5) 用List模板定义List型的模板类对象double_listA, double_listB, double_listC,重复上述操作。(15分) 3. 输入输出样例: 1) 输入样例 4 12 23 34 45 3 56 67 78 3 1.2 2.3 3.4 4 4.5 5.6 6.7 7.8 2) 输出样例 12 23 34 45 56 67 78 1.2 2.3 3.4 4.5 5.6 6.7 7.8
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值