#include "SeqList.h"
using namespace std;
int main() {
SeqList sqList(100);
int choice;
while (true) {//while这个大括号里一定要有一个system pause
//在每一个case执行后能停一下,不然就菜单刷屏了,以前真的落下太多了
cout << "-------------请选择:------------\n";
cout << "1.表创建\n2.插入元素\n3.删除元素\n4.显示所有元素\n5.退出" << endl;
if (!cin) {
cin.clear(); // 清除错误状态
cin.ignore(numeric_limits<streamsize>::max(), '\n'); // 忽略剩余输入
continue; // 重新开始循环
}//我的菜单如果前一个选的是1,后面菜单显示就没法选择选项了
//好像因为@不是数字的原因,导致输入流进入错误状态了
cin >> choice;
switch (choice) {
case 1: {
cout << "请输入任意个整数(<100,@表示结束)" << endl;
/*int num;
while (cin >> num && num != '@') {
sqList.Insert(sqList.GetSize() + 1, num);
}*/
int num;
while (cin >> num) {
sqList.Insert(sqList.GetLast() + 2, num);
if (cin.peek()== '@') {
cin.ignore();
break;
}
}
break;
}
case 2: {
int i, x;
cout << "插入整数\n请输入您想插入的位置i(0<=i<=100)" << endl;
cin >> i;
cout << "请输入您想插入的整数" << endl;
cin >> x;
sqList.Insert(i, x);
break;
}
case 3: {
cout << "请输入您想删除的元素" << endl;
int x;
cin >> x;
sqList.Remove(x);
break;
}
case 4:
sqList.Display();
break;
case 5:
return 0;
}
system("pause");//等待用户输入
}
return 0;
}
//构造函数
SeqList::SeqList(int sz)
{
//判断是否为有效的容量
if (sz > 0) {
maxsize = sz;
data = new int[maxsize];
last = -1;
}
//内存分配失败,显示错误提示
if (data == NULL) {
cout << "error!" << endl;
exit(1);
}
}
//插入元素
bool SeqList::Insert(int i, int x)
{//判断插入位置是否有效(i>=1)
if (i<1 || i>last + 2)//位置不合理
return false;
if (last + 1 >= maxsize)//表满
return false;
for (int j = last; j >= i-1; j--) {
data[j + 1] = data[j];
}
data[i-1] = x;
//忘写了
last++;
return true;
}
//删除第i个元素
bool SeqList::Delete(int i, int& x)
{
//表空不能删除
if (last <= -1)
return false;
//不合理的位置,不能删除
if (i <= 0 || i > last + 1)
return false;
for (int j = i; j <= last; j++) {//从前往后,元素前移
data[j - 1] = data[j];
}
//忘写了
last--;
return true;
}
//删除多个元素(时间复杂度为o(n^2))
//bool SeqList::Remove(int& x) {
// for (int i = last; i >= 0; i--) {//必须要从后往前删除,从前往后会导致删除后元素前移,会跳过某些元素
// if (data[i] == x) {
// for (int j = i; j < last; j++) {
// data[j] = data[j + 1];
// }
// }
// last--;
// }
// return true;
//}
//按元素值删除多个元素
bool SeqList::Remove(int& x) {
int* tempo = new int[maxsize];//创建临时数组
int index = 0;//新数组的下标
for (int i = 0; i <= last; i++) {
if (data[i] != x) {
tempo[index] = data[i];// 将不等于x的元素复制到临时数组
index++;
}
}
delete[]data;//释放原表内存
data = tempo;//重新赋值给原表
last = index;//更新最后一个元素的索引
return true;
}
//获取第i个元素
bool SeqList::getData(int i, int& x)
{
//异常处理
if (i<0 || i>last)
return false;
x = data[i];
return true;
}
int SeqList::Search(int& x)
{
for (int i = 0; i <= last; i++) {
if (data[i] == x)
return i + 1;//若找到,则返回是第几个元素
}
//没找到,返回异常值
return 0;
}
// 获取当前元素数量
int SeqList::GetLast() {
return last;
}
//显示元素
void SeqList::Display() {
for (int i = 0; i <= last; i++) {
cout << data[i] << " ";
}
cout << endl;
}
//析构函数没实现,报错 链接错误,我服了
SeqList::~SeqList() {
delete[] data;
}
