课程设计--基于模板的顺序表的使用

该博客介绍了C++实现顺序表的基本功能,包括初始化、尾插、定点插入、删除、元素逆置及读取数据。顺序表创建时设定默认数组大小,并提供了动态分配内存、释放内存的机制。此外,还详细讲解了如何进行尾插、按位置插入、按值插入、按位置删除和按值删除操作,以及如何实现顺序表的元素逆序。代码简洁明了,适用于数据结构学习与实践。
摘要由CSDN通过智能技术生成

顺序表功能

数据结构顺序表课设,附带功能:尾插、定点插入、按照内容单插多插、定点删除、按照内容单删多删、元素逆置等。

正文

顺序表创建

作为顺序表,创建时需要带有一个默认的数组大小,这里的大小就用define定义了。

#define defaultSize 200

之后开始创建顺序表的基础部分:

template <class T>
class Seq
{
protected:
	T* data;        //存放数组
	int maxSize = 0;//最大可容纳表项的项数
	int last = 0;   //当前已存表项的最后位置(从0开始)
public:
	Seq(int sz = defaultSize) {//构造函数
	    if (sz > 0) {
		maxSize = sz; last = 0;
		data = new T[maxSize];//创建顺序表存储数组
		if (data == NULL) {   //动态分配失败
		    cout << "动态分配失败" << endl;
			return false}
	}
	~Seq() {
		delete[] data;
	}
	int Size() {
		return maxSize;
	}
	int Length() {
		return last;
	}
};

顺序表尾插

有了顺序表的主体,那就开始一点点的铺设功能。首先给它创建一个尾插,把输入的数据依次插入顺序表中,组成顺序表中的数据。

template<class T>
bool Seq<T>::Push_back(T x)
{
	if (last == maxSize) { //表满
		cout << "表满,不可插入!" << endl;
		return false;
	}
	data[last] = x;  //插入(新表项在data[last]处)
	last++;//已用空间+1
	return true;  //插入成功
}

顺序表插入

数据输入时,难免存在漏输的问题,这就需要有一个插入函数,总不能删了重输或者迭代查找吧。

template <class T>
bool Seq<T>::Insertn(int& i, T x) //顺序表位插算法
{
	if (last == maxSize) {//表满
		cout << "表满,不可插入!" << endl;
		return false;
	}
	if (i<1 || i>last) {//参数i不合理
		cout << "参数输入错误!" << endl;
		return false;
	}
	for (int j = last; j >= i; j--) //依次后移
		data[j] = data[j - 1];
	data[i - 1] = x;//插入(第i表项在data[i-1]处)
	last++;
	return true;  //插入成功
}
template <class T>
bool Seq<T>::Insertd(int& n, T& x, T y) //顺序表值插算法,n为单多插提示数据
{
	if (last == maxSize) {//表满
		cout << "表满,不可插入!" << endl;
		return false;
	}
	for (int i = 2; i <= last + 1; i++) {
		if (data[i - 2] == x && n == 0) {//单插部分
			if (i != last + 1) {
				for (int j = last; j >= i; j--) //依次后移
					data[j] = data[j - 1];
			}
			data[i - 1] = y;//插入(第i表项在data[i-1]处)
			last++;
			break;
		}
		if (data[i - 2] == x && n == 1) {//多插部分
			if (i != last + 1) {
				for (int j = last; j >= i; j--) //依次后移
					data[j] = data[j - 1];      //这里有好几种多插方法,不过最简单的还是写这种,不过就是O()有点大。
			}
			data[i - 1] = y;//插入(第i表项在data[i-1]处)
			last++;
			i++;
		}
	}
	return true;  //插入成功
}

顺序表删除

输入多了的删除。

template <class T>
bool Seq<T>::Removen(int& i) //按位删
{
	if (last == -1) { //表空,不能删除
		cout << "表空,不可删除!" << endl;
		return false;
	}
	else if (i<1 || i>last) {//参数i不合法
		cout << "参数输入错误!" << endl;
		return false;
	}
	for (int j = i; j <= last; j++) {
		data[j - 1] = data[j];//依次前移
	}
	last--;//最后位置减1
	return true;//删除成功
}
template <class T>
bool Seq<T>::Removed(int& i, T& x)//按值删,i为单删多删的识别符
{
	if (last == -1) { //表空,不能删除
		cout << "表空,不可删除!" << endl;
		return false;
	}
	int i0 = 0, n = 0;
	for (int j = 0; j < last; j++) {//同一个for循环
		if (data[j] == x && i == 0) {//识别到就打断
			break;
		}
		if (data[j] != x) {//识别不到就执行数据迁移
			data[i0] = data[j];
		    i0++;
		}
	}
	if (i == 0) {//处理单插被打断部分
		for (int j = i0 + 1; j < last; j++) {
			data[j - 1] = data[j];//依次前移
		}
		last--;//只删除了一个,-1
	}
	else if (i == 1) {
		last = i0;//删除多个,可用空间就是删除后的序号值
	}
	return true;
}

顺序表逆序

二分交换数据,没什么好说的。

template <class T>
bool Seq<T>::Reverse()
{
	if (last == 0) { //表空,不能执行
		cout << "表空,不可执行!" << endl;
		return false;
	}
	for (int i = 0; i < last / 2; i++) {
		T tmp = data[i];
		data[i] = data[last - 1 - i];
		data[last - 1 - i] = tmp;
	}
	return true;
}

顺序表读取

能往外读取的顺序表才是好顺序表。

template <class T>
T Seq<T>::Read(int i)
{
	if (i<1 || i>last) {//参数i不合理
		cout << "参数输入错误!" << endl;
		return false;
	}
	return data[i - 1];
}

结尾

这里的顺序表只是些比较常用的功能,而且代码也就这些量,就不上传文件了。
另外这个是从我作业的mfc封装好的头文件里拆的,可能会有些许地方报错;至于头文件的补全,应该差个iostream了。
Ps:由于本人才疏学浅,错误纰漏之处在所难免,如果您在阅读的过程中发现了文章的错误和不足,欢迎交流学习与指正。

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Kmiay

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值