代码实现:
//线性表
#include<iostream>
using namespace std;
const int defaultSize = 100;
class SeqList {
public:
SeqList(int sz = defaultSize) {
if (sz > 0) {
maxSize = sz;
last = -1;
data = new int[maxSize];
}
}
SeqList(SeqList& L) {
maxSize = L.Size();
last = L.Length() - 1;
int value;
data = new int[maxSize];
if (data == NULL) {
cerr << "存储分配错误" << endl;
exit(1);
}
for (int i = 1; i <= last + 1; i++) {
L.getData(i, value);
data[i - 1] = value;
}
}
~SeqList() {
delete []data;
}
int Size()const {
return maxSize;
}
int Length()const {
return last + 1;
}
int Search(int& x)const {
for (int i = 0; i <= last; i++) {
if (data[i] == x)return i + 1;
}
return 0;
}
int Locate(int i)const {
if (i >= 1 && i <= last + 1)return i;
return 0;
}
bool getData(int i, int& x)const {
if (i > 0 && i <= last + 1) {
x = data[i - 1]; return true;
}
else return false;
}
bool setData(int i, int& x)const {
if (i > 0 && i <= last + 1) {
data[i - 1] = x; return true;
}
else return false;
}
bool Insert(int i, int& x) {
if (last + 1 == maxSize)return false;
if (i<0 || i>last + 1)return false;
for (int j = last; j >=i; j--) {
data[j + 1] = data[j];
}
data[i] = x;
last++;
return true;
}
bool Remove(int i, int& x) {
if (last == -1)return false;
if (i<0 || i>last + 1)return false;
x = data[i - 1];
for (int j = i; j <= last; j++) {
data[j-1] = data[j];
}
last--;
return true;
}
bool IsEmpty() {
return(last == -1) ? true : false;
}
bool IsFull() {
return (last == maxSize - 1) ? true : false;
}
void input() {
cout << "开始建立您的顺序表:" << endl;
while (1) {
cout << "先输入您要输入的个数:" << endl;
cin >> last;
last = last - 1;
if (last <= maxSize - 1)break;
cout << "您要输入的个数超出范围,请小于等于" << maxSize - 1 << endl;
}
for (int i = 0; i <= last; i++) {
cout << "请输入第" << i + 1 << "个元素:";
cin >> data[i];
cout << endl;
}
}
void output() {
if (last == -1) {
cout << "没有数据!请先输入!" << endl;
return;
}
for (int i = 0; i <= last; i++) {
cout << "第" << i + 1 << "个元素:" << data[i] << endl;
}
}
void reSize(int i) {
resize(i);
}
private:
int* data;
int maxSize;
int last;
void resize(int newSize) {
if (newSize <= 0) {
cerr << "无效大小" << endl;
exit(1);
}
if (newSize != maxSize) {
int* newarray = new int[newSize];
if (newarray == NULL) {
cerr << "存储分配失败!" << endl;
exit(1);
}
int* srcptr = data;
int* destptr = newarray;
int l = 0;
if (last >= newSize) {
last = newSize - 1;
}
int n = last + 1;
while (n--) {
*destptr++ = *srcptr++;
}
delete []data;
data = newarray;
maxSize = newSize;
if (last >= newSize)last = newSize - 1;
}
}
};
遇到的问题:
数组越界会导致delete时候出错,但不会在越界操作时报错,而是在delete时报错,原因是释放不掉不属于自己管理的内存空间。一开始以为是delete的问题,所以去研究了下delete,基本类型组成的数组空间用 delete 和 delete[] 都可以,数组对象只可以用delete[](否则只调用了数组对象第一个对象的析构函数)。
为了方便记忆,new用delete,new[]用delete[]。