顺序表类定义

// abstract data type for List
template <class T>
class List {
    void clear();                   // 置空线性表
    bool isEmpty();                 // 线性表为空时,返回True
    bool append(T value);           // 在表尾加上一个元素value,表的长度增1
    bool insert(int p, T value);    // 在位置p上插入一个元素vaule,标的长度增1
    bool del(int p);                // 删除位置p上的元素,表的长度减1
    T getValue(int p);              // 返回位置p的元素值
    T setValue(int p, T value);     // 用value修改位置p的元素值
    void print();                   // 打印线性表
};


template <class T>              // 假定线性表的元素类型为T
class arrList : public List<T>  // 顺序表,向量
{
private:                        // 现行包的取值类型和取值空间
    int maxSize;                // 私有变量,顺序表实例的最大长度
    int curLen;                 // 私有变量,顺序表实例的当前长度
    int position;               // 私有变量,当前处理位置
    T* aList;                   // 私有变量,存储顺序表的实例

public:                         // 顺序表的运算集
    arrList(const int size)     // 创建一个新的顺序表,参数为表实例的最大长度
    {
        maxSize = size;
        aList = new T[maxSize];
        curLen = 0;
        position = 0;
    }

    ~arrList()                // 析构函数,用于消除该表实例
    {
        delete [] aList;
    }

    void clear()                // 讲顺序表存储的内容清除,成为空表
    {
        delete [] aList;
        curLen = 0;
        position = 0;
        aList = new T[maxSize];
        // 或者直接置curlen和position为0
    }

    int length();               // 返回此顺序表的当前实际长度
    bool append(T value);       // 在表尾添加一个元素value,表的长度增1
    bool insert(int p, T value);// 在位置p上插入一个元素value,表的长度增1
    bool del(int p);            // 删除位置p上的元素,表的长度减1
    int getPos(const T value);  // 在线性表中查找值为value的元素,并返回第1次出现的位置
    void print();               // 打印线性表
};

template <class T>
bool arrList<T>::append(T value)  // 在表尾添加一个元素value,表的长度增1
{
    if (curLen >= maxSize)        // 检查顺序表是否溢出
    {
        cout << "The list is overflow." << endl;
        return false;
    }
    aList[curLen++] = value;
    return true;
}

template <class T>
bool arrList<T>::insert(int p, T value) // 在位置p上插入一个元素value,表的长度增1;插入成功返回true,否则返回false
{
    if (curLen >= maxSize)          // 检查顺序表是否溢出
    {
        cout << "The list is overflow." << endl;
        return false;
    }
    if (p<0 || p>curLen)            // 检查插入位置是否合法
    {
        cout << "Insertion is illegal" << endl;
        return false;
    }
    int i;
    for (i = curLen; i > p; i++)    // 从表位curLen-1开始往右移一位直到p
        aList[i] = aList[i-1];
    aList[p] = value;               // 在位置p出插入新元素
    curLen++;                       // 表的实际长度增1
    return true;
}

template <class T>
bool arrList<T>::del(int p)         // 删除位置p上的元素,表的长度减 1
{
    if (curLen <= 0)                // 检查顺序表是否为空
    {
        cout << "No element to delete." << endl;
        return false;
    }
    if (p < 0 || p > curLen-1)      // 检查删除位置是否合法
    {
        cout << "deletion is illegal" << endl;
        return false;
    }
    int i;
    for (i = p; i < curLen - 1; i++)// 从位置p开始每个元素左移一位知道curLen-1
        aList[i] = aList[i+1];
    curLen--;                       // 表的实际长度减1
    return true;
}

template <class T>
int arrList<T>::getPos(const T value)// 在线性表中查找值为value的元素,并返回第1次出现的位置
{
    int i;                          // 元素下表
    for (i=0; i<curLen; i++)        // 依次比较
    {
        if (value == aList[i])      // 找到下标为i的元素与value相等,就返回下标i
            return i;
    }
    return -1;                      // 如果没有找到元素值为value的元素,返回-1
}

template <class T>
void arrList<T>::print()           // 打印线性表
{
    for (int i = 0; i < curLen; i++)
        cout << aList[i] << " ";
    cout << endl;
}

你可能感兴趣的:(代码)