#include using namespace std; //顺序表最大输入范围 const int N = 100; // C++ 类构造函数 & 析构函数 // https://www.runoob.com/cplusplus/cpp-constructor-destructor.html //声明一个模板,虚拟类型名为T template class setlist { //类模板名为setlist //私有 private: T data[N]; //存放数据的数组date; int length; //线性表长度; //公有 public: //空构造函数 setlist() { length = 0; // 初值 } //构造函数 setlist(T a[], int n) { if (n > N) throw "装不下,参数非法"; for (int i = 0; i < n; i++) { data[i] = a[i];//保存到内部的数组中 length = n; } } // 析构函数:类的析构函数是类的一种特殊的成员函数,它会在每次删除所创建的对象时执行。 // 析构函数的名称与类的名称是完全相同的,只是在前面加了个波浪号(~)作为前缀,它不会返回任何值, // 也不能带有任何参数。析构函数有助于在跳出程序(比如关闭文件、释放内存等)前释放资源。 ~setlist() {} //对外获取长度的函数调用入口 int Length() { return length; } //按索引定位值的方法 T Get(int i) { if (i < 1 || i > length) throw "查找位置非法"; else return data[i - 1]; } //按值定位索引的方法 int Locate(T x) { for (int i = 0; i < length; i++) if (data[i] == x) return i + 1; return 0; } //插入一个对象 void insert(int i, T x) { if (length >= N) throw "上溢"; if (i < 1 || i > length + 1) throw "位置异常"; //向后移动一个位置 for (int j = length; j >= i; j--) { data[j] = data[j - 1]; } //将插入的对象放到指定的位置上 data[i - 1] = x; //修改长度属性 length++; } //删除一个对象:按位置删除 T Delete(int i) { if (length == 0)throw "下溢"; if (i < 1 || i > length)throw "位置异常"; T x = data[i - 1]; //备份一个出来,用于返回 //开始从这个位置到最后,一个个向左移动过来 for (int j = i; j < length; j++) data[j - 1] = data[j]; //长度属性-1 length--; //返回这个对象 return x; } //输出顺序表 void PrintList() { for (int i = 0; i < length; i++) cout << data[i]; cout << endl; } }; int main() { //数组test int test[5] = {2, 1, 3, 4, 5}; //通过构造函数进行构建顺序表 setlist a = setlist(test, 5); //输出顺序表 a.PrintList(); //测试各个内置方法 cout << "长度为:" << a.Length() << endl; cout << "位置为:" << a.Locate(2) << endl; cout << "数值为:" << a.Get(1) << endl; cout << "删除的数据为:" << a.Delete(1) << endl; a.PrintList(); //测试插入数据 a.insert(2,0); a.PrintList(); }