课程目标
完成顺序存储结构线性表的抽线实现
SqlList 设计要点
- 抽象类模板,存储空间的位置和大小由子类完成
- 实现顺序存储结构线性表的关键操作(增,删,查,等)
- 提供数组操作符,方便快速获取元素
template <typename T>
class SqlList : public List<T>
{
public:
bool insert(const T &e);
bool insert(int i, const T &e);
bool remove(int i);
bool set(int i, const T &e);
bool get(int i, T &e) const;
int length() const;
void clear();
T &operator[] (int i);
T operator[] (int i) const;
virtual int capacity() const = 0;
protected:
T *m_array;
int m_length;
};
编程实验:顺序存储线性表
SqlList.h
#ifndef SQLLIST_H
#define SQLLIST_H
#include "List.h"
#include "Exception.h"
namespace DTLib
{
template <typename T>
class SqlList : public List<T>
{
public:
bool insert(const T &e) override
{
return insert(m_length, e);
}
bool insert(int i, const T &e) override
{
bool ret = ((0 <= i) && (i <= m_length)); // 注:目标位置可以为m_length,表示尾部插入
ret = ret && (m_length < capacity());
if (ret)
{
for (int p = m_length - 1; p >= i; --p)
{
m_array[p + 1] = m_array[p];
}
m_array[i] = e;
++m_length;
}
return ret;
}
bool remove(int i) override
{
bool ret = ((0 <= i) && (i < m_length));
if (ret)
{
for (int p = i + 1; p < m_length; ++p)
{
m_array[p - 1] = m_array[p];
}
--m_length;
}
return ret;
}
bool set(int i, const T &e) override
{
bool ret = ((0 <= i) && (i < m_length));
if (ret)
{
m_array[i] = e;
}
return ret;
}
bool get(int i, T &e) const override
{
bool ret = ((0 <= i) && (i < m_length));
if (ret)
{
e = m_array[i];
}
return ret;
}
int length() const
{
return m_length;
}
void clear()
{
m_length = 0;
}
T &operator[] (int i)
{
if ((0 <= i) && (i < m_length))
{
return m_array[i];
}
else
{
THROW_EXCEPTION(IndexOutOfBoundsException, "Parameter i is invalid ...");
}
}
T operator[] (int i) const
{
return (const_cast<SqlList&>(*this))[i];
}
virtual int capacity() const = 0;
protected:
T *m_array = nullptr;
int m_length = 0;
};
}
#endif // SQLLIST_H
To be continued
思考:
StaticList 和 DynamicList 如何实现,差异在哪里?
是否可以将DynamicList 作为 StaticList 的子类实现?
以上内容整理于狄泰软件学院系列课程,请大家保护原创!
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。