我是靠谱客的博主 心灵美小馒头,最近开发中收集的这篇文章主要介绍游戏开发之使用类封装双链表数据结构及双链表迭代器--第二版(C++基础)游戏开发之使用类封装双链表数据结构及双链表迭代器–第二版(C++基础),觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

游戏开发之使用类封装双链表数据结构及双链表迭代器–第二版(C++基础)

1.数据结构及其实现如下

#include <iostream>

//双链表及其迭代器
class List
{
private:
	//外部无法访问Node子类
	class Node
	{
	public:
		Node *_front;//前驱节点
		Node *_next;//后继节点
		int _v;//数据
	};

	Node* _pBegin;//记录头节点的前一个节点
	Node* _pEnd;//记录尾节点的后一个节点
	int _nSize;//当前链表大小

public:
	//构造函数
	List()
	{
		//_pBegin 和_pEnd 不使用且不移动,只用于记录
		_pBegin = new Node;
		_pEnd = new Node;
		//nullptr是C++中的一个增强,是一个宏
		_pBegin->_front = _pEnd->_next = nullptr;
		_pBegin->_next = _pEnd;
		_pEnd->_front = _pBegin;
		_nSize = 0;
	}

	//尾部插入
	void push_back(const int v)
	{
		Node *p = new Node;
		p->_v = v;

		p->_front = _pEnd->_front;
		_pEnd->_front->_next = p;
		p->_next = _pEnd;
		_pEnd->_front = p;
		++_nSize;
	}

	//头部插入
	void push_front(const int v)
	{
		Node* p = new Node;
		p->_v = v;

		p->_next = _pBegin->_next;
		p->_next->_front = p;
		p->_front = _pBegin;
		_pBegin->_next = p;
		++_nSize;
	}
	//获取当前链表大小
	int GetSize()
	{
		return _nSize;
	}


public:
	//正向迭代器
	class iterator
	{
		friend class List;//友元类
	private:
		Node *_pNode;//记录当前节点位置及数据信息
	public:
		//构造函数重载
		iterator(Node *pNode_)
		{
			_pNode = pNode_;
		}

		//前置++运算符重载
		const iterator& operator++()
		{
			_pNode = _pNode->_next;
			return *this;
		}

		//判断两个节点是否相同,!=运算符重载
		bool operator!=(const iterator& iter)
		{
			return _pNode != iter._pNode ? 1: 0;
		}

		//取值,*运算符重载
		int& operator*()
		{
			return _pNode->_v;
		}
	};
	//获取当前双链表的第一个节点
	iterator begin()
	{
		return iterator(_pBegin->_next);
	}
	//获取当前双链表的最后一个节点的下一个节点
	iterator end()
	{
		return iterator(_pEnd);
	}

	//头部迭代器会失效,尾部迭代器不会失效,因为尾部迭代器并未存储数据信息,只用于记录
	//删除当前迭代器位置并返回下一个位置元素
	iterator erase(const iterator& iter)
	{
		Node *p = iter._pNode;
		//删除当前元素的并返回下一个元素
		iterator it_(p->_next);

		p->_front->_next = p->_next;
		p->_next->_front = p->_front;
		delete p;
		--_nSize;
		return it_;
	}
};

2.测试

int main()
{
	List list;
	list.push_back(1);
	list.push_back(2);
	list.push_back(3);
	list.push_front(-1);
	list.push_front(-2);
	list.push_front(-3);

	list.erase(list.begin());

	//C++11以后的特性:auto 根据右值推导左值类型
	auto begin = list.begin();
	auto end = list.end();

	for (; begin != end; ++begin)
		std::cout << *begin << std::endl;
	return 0;
}

最后

以上就是心灵美小馒头为你收集整理的游戏开发之使用类封装双链表数据结构及双链表迭代器--第二版(C++基础)游戏开发之使用类封装双链表数据结构及双链表迭代器–第二版(C++基础)的全部内容,希望文章能够帮你解决游戏开发之使用类封装双链表数据结构及双链表迭代器--第二版(C++基础)游戏开发之使用类封装双链表数据结构及双链表迭代器–第二版(C++基础)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(51)

评论列表共有 0 条评论

立即
投稿
返回
顶部