本文总结学习动态顺序表类的各个成员实现。
顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储。在数组上完成数据的增删查改。
一般分为:
template<class T>
class SeqList // sequence(顺序) list(列表)
{
public:
// 成员函数
private:
// 成员变量
T* _a;
size_t _size;
size_t _capacity;
};
// 构造函数
SeqList()
: _a(nullptr)
, _size(0)
, _capacity(0)
{}
// 销毁(析构函数)
~SeqList()
{
if (_a)
{
delete[] _a;
_a = nullptr;
}
_size = 0;
_capacity = 0;
}
// 打印
void Print()
{
for (size_t i = 0; i < _size; i++)
{
cout << _a[i] << " ";
}
cout << endl;
}
// 检查容量(初始化/扩容)
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;
}
}
// 插入(时复: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++;
}
// 删除(时复: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];
}
}
}
// 查找(时复:o(n))
bool Find(const T& x)
{
for (size_t i = 0; i < _size; i++)
{
if (x == _a[i])
{
return true;
}
}
return false;
}
// 尾插(时复:o(1))
void push_back(const T& x)
{
// 检查初始容量(两个if判断,双重保险)
if (_size == _capacity || 0 == _capacity)
{
CheckCapacity();
}
// 尾插元素
_a[_size++] = x;
}
// 尾删(时复:o(1))
void pop_back()
{
assert(!IsEmpty());
--_size;
}
// 头插(时复: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++;
}
// 头删(时复:o(n))
void pop_front()
{
assert(!IsEmpty());
for (size_t i = 0; i < _size - 1; i++)
{
_a[i] = _a[i + 1];
}
--_size;
}
// 修改
void Modify(const T& x, size_t pos)
{
// 检查pos合法性!!!!!!!!
assert(pos >= 0 && pos < _size);
_a[pos] = x;
}
这里对文章进行总结:
以上就是今天总结的内容,本文包括了C++实现动态顺序表各个成员,分享给大家。
真💙欢迎各位给予我更好的建议,欢迎访问!!!小编创作不易,觉得有用可以一键三连哦,感谢大家。peace
希望大家一起坚持学习,共同进步。梦想一旦被付诸行动,就会变得神圣。
欢迎各位大佬批评建议,分享更好的方法!!!🙊🙊🙊