C++ ——— 模拟实现 list 类

目录

list 类的框架

无参数的构造函数

实现迭代器

在任意节点位置插入新节点

删除指定节点

清空数据

析构函数

拷贝构造


list 类的框架

namespace rjj
{
	template<class T>
	// 单个节点的结构
	struct list_node
    {
	    list_node<T>* _prev;
	    T _data;
	    list_node<T>* _next;

	    list_node(const T& x = T())
		    :_data(x)
		    ,_prev(nullptr)
		    ,_next(nullptr)
        {}
    };    

	template<class T>
	class list
	{
		typedef list_node<T> node;

	public:


	private:
		node* _head;
	};
}

无参数的构造函数

void empty_init()
{
	_heaed = new node;
	_head->_next = _head;
	_head->_prev = _head;
}
// 无参构造
list()
{
	empty_init();
}

new 一个节点出来,并且节点的首尾指针指向自己


实现迭代器

template<class T>
struct __list_iterator
{
	typedef list_node<T> Node;
	typedef __list_iterator<T> self;

	Node* _node;

	__list_iterator(Node* node)
		:_node(node)
	{}

	// 重载后置++运算符
	self& operator++()
	{
		_node = _node->_next;
		return *this;
	}

	// 重载*操作符
	T& operator*()
	{
		return _node->_data;
	}

	// 重载 != 运算符
	bool operator!=(const self& s)
	{
		return _node != s._node;
	}
};

begin 和 end 的定义:

public:
	// 迭代器
	typedef __list_iterator<T> iterator;
	iterator begin()
	{
		return iterator(_head->_next);
	}
	iterator end()
	{
		return iterator(_head);
	}

测试代码:


在任意节点位置插入新节点

void insert(iterator pos, const T& val)
{
	// 找到 pos 节点
	node* cur = pos._node;
	
	// 开辟新节点
	node* newnode = new node(val);

	// 找到 pos 节点的前一个节点
	node* prevndoe = cur->_prev;

	// 前一个节点链接新节点
	prevndoe->_next = newnode;
	newnode->_prev = prevndoe;

	// pos 节点链接新节点
	cur->_prev = newnode;
	newnode->_next = cur;
}

测试代码:


删除指定节点

iterator erase(iterator pos)
{
	// 找到 pos 节点 
	node* cur = pos._node;
	// 找到 pos 节点的前一个节点
	node* prevnode = cur->_prev;
	// 找到 pos 节点的后一个节点
	node* nextnode = cur->_next;

	// 释放 pos 节点
	delete cur;

	// 链接前后两个节点
	prevnode->_next = nextnode;
	nextnode->_prev = prevnode;

	// 返回 pos 节点的下一个节点
	return iterator(nextnode);
}

测试代码:


清空数据

void clear()
{
	iterator it = begin();
	while (it != end())
	{
		it = erase(it);
	}
}

直接调用 erase() 函数清理数据,并且 erase() 会返回下一个节点的指针,所以不用担心 it 不能指向下一个位置


析构函数

~list()
{
	clear();

	delete _head;
	_head = nullptr;
}


拷贝构造

list(list<T>& lt)
{
	// 先初始化
	empty_init();

	for (auto e : lt)
	{
		Push_back(e);
	}
}

先对要构造的对象进行初始化,否则可能会发生报错,再利用范围 for 依次取出 lt 的内容尾插到构造的对象中

测试代码:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值