课程目标

完成顺序存储结构线性表的抽线实现

image.png

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

image.png

思考:
StaticList 和 DynamicList 如何实现,差异在哪里?
是否可以将DynamicList 作为 StaticList 的子类实现?

以上内容整理于狄泰软件学院系列课程,请大家保护原创!


TianSong
734 声望138 粉丝

阿里山神木的种子在3000年前已经埋下,今天不过是看到当年注定的结果,为了未来的自己,今天就埋下一颗好种子吧