数据结构C++版顺序表

本文介绍了使用C++实现顺序表数据结构时遇到的问题,特别是关于数组越界导致的错误。在删除元素时,如果数组越界,错误可能不会在操作时显示,而会在释放内存时触发。强调了正确使用delete和delete[]来释放不同类型的动态内存的重要性,以及new与delete、new[]与delete[]的匹配原则。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

代码实现:

//线性表 
#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[]。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值