#include"SeqList.h"
using namespace std;
//创建顺序表
bool SeqList::Init()
{
maxsize = 100; last = -1;
data = new int[maxsize]; //创建顺序表存储数组
if (data == NULL) { //动态分配失败
cerr << "存储分配错误!" << endl;
exit(1);
}
cout << "请输入任意个整数(<100,@表示结束)" << endl;
/*int num;
while (cin >> num && num != '@') {
sqList.Insert(sqList.GetSize() + 1, num);
}*/
int num;
while (cin >> num) {//顺序表赋值
data[++last] = num;
if (cin.peek() == '@') {//结束符
cin.ignore();
break;
}
}
return true;
}
bool SeqList::Insert()
{
//按位置插入或按值插入
cout << "请选择:\n[1]按位置插入\n[2]按值插入\n";
int choice;
cin >> choice;
//按位置插入
switch (choice) {
case 1: {
int x, i;
cout << "请输入您想插入的数字\n";
cin >> x;
cout << "您想插入到哪个位置,请输入位置i \n";
cin >> i;
//判断插入位置是否有效(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;
}
//按值插入
case 2: {
int x, y;
cout << "请输入您想插入的数字\n";
cin >> x;
cout << "您想从哪个数字后插入,请输入数字\n";
cin >> y;
cout << "您想进行单插还是多插\n【1】单插【2】多插" << endl;
int flag;
cin >> flag;
int index = 0;
int count = 0;
int newSize = 2 * maxsize;//创建临时数组,保存插入后的顺序表
int* temp = new int[newSize];
for (int i = 0; i <= last; i++) {
temp[index++] = data[i];//遍历将原表复制到新表
if (data[i] == y) {//如果找到指定元素,往后插入
temp[index++] = x;
count++;
}
}
delete[]data;
last = index - 1;
length = last + 1+count;
maxsize = newSize;
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()
{
cout << "请输入您想删除的元素" << endl;
int x;
cin >> x;
cout << "您想进行单删还是多删\n【1】单删【2】多删" << endl;
int flag;
cin >> flag;
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++;
if (flag == 1)//单删
break;
}
}
delete[]data;//释放原表内存
data = tempo;//重新赋值给原表
last = index-1;//更新最后一个元素的索引
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;
}
bool SeqList::InsertLast()
{
cout << "请输入您想要表中添加的元素\n";
int num;
cin >> num;
data[++last] = num;
length++;
return true;
}
//显示元素
void SeqList::Display() {
for (int i = 0; i <= last; i++) {
cout << data[i] << " ";
}
}
//析构函数没实现,报错 链接错误,我服了
SeqList::~SeqList() {
delete[] data;
}
多插有问题,但是找不出来