【动态顺序表实现-C++】

本文详细介绍了C++中动态顺序表类的实现,包括构造、析构、打印、容量检查、元素插入、删除、查找、尾插、尾删、头插、头删及修改等操作。代码示例展示了每个成员函数的具体实现,帮助读者理解动态顺序表的数据操作原理。
摘要由CSDN通过智能技术生成

请添加图片描述



前言

本文总结学习动态顺序表类的各个成员实现。

顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构一般情况下采用数组存储。在数组上完成数据的增删查改。
一般分为:


一、顺序表类主要框架

template<class T>
class SeqList // sequence(顺序) list(列表)
{
public:
	// 成员函数 
private:
	// 成员变量
	T* _a;
	size_t _size;
	size_t _capacity;
};

二、顺序表各成员函数具体实现

2.1 构造函数

// 构造函数
	SeqList()
		: _a(nullptr)
		, _size(0)
		, _capacity(0)
	{}

2.2 析构函数

// 销毁(析构函数)
	~SeqList()
	{
		if (_a)
		{
			delete[] _a;
			_a = nullptr;
		}
		_size = 0;
		_capacity = 0;
	}

2.3 顺序表打印

// 打印
	void Print()
	{
		for (size_t i = 0; i < _size; i++)
		{
			cout << _a[i] << " ";
		}
		cout << endl;
	}

2.4 检查空间(初始化 / 扩容)

// 检查容量(初始化/扩容)
	void CheckCapacity()
	{
		if (_size == _capacity || 0 == _capacity)
		{
			// 初始化/扩容
			size_t newcapacity = (0 == _capacity) ? 5 : 2 * _capacity;
			T* tmp = new T[newcapacity];

			// 如果是初始化,则_size为0,不进入循环
			int j = 0;
			for (size_t i = 0; i < _size; i++)
			{
				tmp[j++] = _a[i];
			}

			_a = tmp;
			// delete[] tmp; // 这里不能释放,_a和tmp指向同一块空间!!!!!!!
			tmp = nullptr;
			_capacity = newcapacity;
		}
	}

2.5 顺序表在pos位置(下标)插入元素x

// 插入(时复:o(n))
	void insert(const T& x, size_t pos)
	{
		// 检查初始容量(两个if判断,双重保险)
		if (_size == _capacity || 0 == _capacity)
		{
			CheckCapacity();
		}

		// 检查pos合法性!!!!!!!
		assert(pos >= 0 && pos <= _size); // pos为_size时相当尾插!!!!!!!!

		for (size_t i = _size; i > pos; i--) // 小心size_t算术转换问题!!!!!!!!!
		{
			_a[i] = _a[i - 1];
		}

		_a[pos] = x;
		_size++;
	}

2.6 顺序表删除pos位置的值

// 删除(时复:o(n))
	void erase(const T& x)
	{
		assert(!IsEmpty());

		for (size_t i = 0; i < _size; i++)
		{
			if (x == _a[i])
			{
				// 先_size--,避免越界!!!!!!!!!!
				_size--;

				// 覆盖删除
				_a[i] = _a[i + 1];
			}
		}
	}

2.7 顺序表查找

// 查找(时复:o(n))
	bool Find(const T& x)
	{
		for (size_t i = 0; i < _size; i++)
		{
			if (x == _a[i])
			{
				return true;
			}
		}

		return false;
	}

2.8 顺序表尾插

// 尾插(时复:o(1))
	void push_back(const T& x)
	{
		// 检查初始容量(两个if判断,双重保险)
		if (_size == _capacity || 0 == _capacity)
		{
			CheckCapacity();
		}

		// 尾插元素
		_a[_size++] = x;
	}

2.9 顺序表尾删

// 尾删(时复:o(1))
	void pop_back()
	{
		assert(!IsEmpty());

		--_size;
	}

2.10 顺序表头插

// 头插(时复:o(n))
	void push_front(const T& x)
	{
		// 检查初始容量(两个if判断,双重保险)
		if (_size == _capacity || 0 == _capacity)
		{
			CheckCapacity();
		}

		// 头插元素
		for (size_t i = _size; i > 0; i--) // 小心size_t算术转换问题!!!!!!!
		{
			_a[i] = _a[i - 1];
		}

		_a[0] = x;
		_size++;
	}

2.10 顺序表头删

// 头删(时复:o(n))
	void pop_front()
	{
		assert(!IsEmpty());

		for (size_t i = 0; i < _size - 1; i++)
		{
			_a[i] = _a[i + 1];
		}

		--_size;
	}

2.11 顺序表修改指定位置元素

// 修改
	void Modify(const T& x, size_t pos)
	{
		// 检查pos合法性!!!!!!!!
		assert(pos >= 0 && pos < _size);

		_a[pos] = x;
	}

总结

这里对文章进行总结:
以上就是今天总结的内容,本文包括了C++实现动态顺序表各个成员,分享给大家。
真💙欢迎各位给予我更好的建议,欢迎访问!!!小编创作不易,觉得有用可以一键三连哦,感谢大家。peace
希望大家一起坚持学习,共同进步。梦想一旦被付诸行动,就会变得神圣。

欢迎各位大佬批评建议,分享更好的方法!!!🙊🙊🙊

  • 10
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值