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


    请添加图片描述



    前言

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

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


    一、顺序表类主要框架

    template<class T>
    class SeqList // sequence(顺序) list(列表)
    {
    public:
    	// 成员函数 
    private:
    	// 成员变量
    	T* _a;
    	size_t _size;
    	size_t _capacity;
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

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

    2.1 构造函数

    // 构造函数
    	SeqList()
    		: _a(nullptr)
    		, _size(0)
    		, _capacity(0)
    	{}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    2.2 析构函数

    // 销毁(析构函数)
    	~SeqList()
    	{
    		if (_a)
    		{
    			delete[] _a;
    			_a = nullptr;
    		}
    		_size = 0;
    		_capacity = 0;
    	}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    2.3 顺序表打印

    // 打印
    	void Print()
    	{
    		for (size_t i = 0; i < _size; i++)
    		{
    			cout << _a[i] << " ";
    		}
    		cout << endl;
    	}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    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;
    		}
    	}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    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++;
    	}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    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];
    			}
    		}
    	}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    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;
    	}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    2.8 顺序表尾插

    // 尾插(时复:o(1))
    	void push_back(const T& x)
    	{
    		// 检查初始容量(两个if判断,双重保险)
    		if (_size == _capacity || 0 == _capacity)
    		{
    			CheckCapacity();
    		}
    
    		// 尾插元素
    		_a[_size++] = x;
    	}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    2.9 顺序表尾删

    // 尾删(时复:o(1))
    	void pop_back()
    	{
    		assert(!IsEmpty());
    
    		--_size;
    	}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    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++;
    	}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    2.10 顺序表头删

    // 头删(时复:o(n))
    	void pop_front()
    	{
    		assert(!IsEmpty());
    
    		for (size_t i = 0; i < _size - 1; i++)
    		{
    			_a[i] = _a[i + 1];
    		}
    
    		--_size;
    	}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

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

    // 修改
    	void Modify(const T& x, size_t pos)
    	{
    		// 检查pos合法性!!!!!!!!
    		assert(pos >= 0 && pos < _size);
    
    		_a[pos] = x;
    	}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    总结

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

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

  • 相关阅读:
    Macs Fan Control Pro:掌握您的Mac风扇,提升散热效率
    类的成员之三:构造器(构造方法)
    从零实现 promise 的 class 和 function 版本
    【数据结构】数组和字符串(五):特殊矩阵的压缩存储:稀疏矩阵——压缩稀疏行(CSR)
    C++(day6)
    外包“混”了2年,我只认真做了5件事,如今顺利拿到字节 Offer...
    【一天学awk】内置变量的使用
    rmq批量消息
    Centos 里面为什么有的磁盘命名/dev/vda 有的是/dev/sda ?
    Docker-compose
  • 原文地址:https://blog.csdn.net/weixin_60866736/article/details/126513920