From 4709062660ed4de0db7d3f3ff7f1658a53d07e5e Mon Sep 17 00:00:00 2001 From: p68710245 Date: Mon, 11 Mar 2024 12:23:47 +0800 Subject: [PATCH] ADD file via upload --- SeqList.hpp | 89 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 89 insertions(+) create mode 100644 SeqList.hpp diff --git a/SeqList.hpp b/SeqList.hpp new file mode 100644 index 0000000..1d64069 --- /dev/null +++ b/SeqList.hpp @@ -0,0 +1,89 @@ +#ifndef SEQLIST_HPP +#define SEQLIST_HPP + +#include +#include + +// 对吴版教材当中的一些设计和写法进行调整 +template +class SeqList +{ + T slist[N]; // 存放顺序表的数组 + int last; // 已存表项的最后位置 +public: + SeqList() { last = -1; } // 默认构造 + int size() const { return last + 1; } // 计算表长度 + int capcity() const { return N; } // 计算表容量 + bool isempty() const { return last == -1; } // 判断表是否空 + bool isfull() const { return last == N - 1; } // 判断表是否满 + T &at(int i); // 取第i个元素之值 + T &operator[](int i); // 重载下标运算符[] + int find(const T &x) const; // 寻找x在表中下标 + bool insert(int i, const T &x); // x插入到表中下标为i的位置 + bool remove(const T &x); // 删除第一个值为x的元素 + void print() const; // 输出线性表内容 +}; + +template +T &SeqList::at(int i) +{ + if (i < 0 || i > last) + { + throw std::out_of_range{"下标不合法!"}; // 抛出异常 + // 如希望不抛出异常可以改为返回静态局部的引用 + // static T temp{}; + // return temp; + } + return slist[i]; +} + +template +int SeqList::find(const T &x) const +{ + int i{0}; + while (i <= last && slist[i] != x) + ++i; // 顺序查找是否有x + return i > last ? -1 : i; // 未找到返回-1,否则返回下标 +} + +template +bool SeqList::insert(int i, const T &x) +{ + if (i < 0 || i > last + 1 || isfull()) + return false; // 插入位置不合理或者满,不能插入 + ++last; + for (int j{last}; j > i; j--) + slist[j] = slist[j - 1]; // 依次后移 + slist[i] = x; + return true; +} + +template +bool SeqList::remove(const T &x) +{ + int i{find(x)}; // 先去找x在哪个位置 + if (i >= 0) + { + --last; + for (int j{i}; j <= last; j++) + slist[j] = slist[j + 1]; // 依次前移,保证表连续 + return true; + } + return false; // 表中不存在 +} + +template +T &SeqList::operator[](int i) +{ + return slist[i]; // 和原生[]一样不检查下标 +} + +template +void SeqList::print() const +{ + for (int i{0}; i <= last; ++i) + std::cout << slist[i] << ' '; + std::cout << '\n'; +} + +#endif \ No newline at end of file