一学就会的顺序表 —— 结构及各种接口 ( 头插 删、尾插 删、特定位置查找 插入 删除 ) 的实现_顺序表 尾插

为了能够看见我们对表的操作,我们还需一个打印出顺序表的接口:

void SeqListPrint(SLT\* ps1)
{
	assert(ps1);
	int i = 0;
	for (i = 0; i < ps1->size; i++)
	{
		printf("%d ", ps1->a[i]);
	}
	printf("\n");
}

增加数据

头插

即在整个表的头部插入数据,实现头插我们要进行的操作就是将整个表的数据都向后挪动一个位置,这样顺序表的头部就会空出一个位置,我们将要插入的数据放入其中即可,实现如下:

void SeqListPushFront(SLT\* psl, SQDataType x)
{
	assert(psl);
	SeqListCheckCapacity(psl); //头插前检查容量是否满
	int end = psl->size - 1;
	int i = 0;
	for (i = end; i >= 0; i--)
	{
		psl->a[i+1] = psl->a[i];//将数据都向后挪一个位置
	}
	psl->a[0] = x;
	psl->size++; //头插后表的数据个数增加一个
}

尾插

尾插就很简单实现,直接在表末放入数据即可

void SeqListPushBack(SLT\* ps1, SQDataType x)
{
	assert(ps1);
	SeqListCheckCapacity(ps1);
	ps1->a[ps1->size] = x;
	ps1->size++;
}

特定位置插入

当我们想在表的特定位置(任意位置)插入数据时,首先要知道想插入位置的下标(pos),然后依次再将表中从该下标开始到表尾的数据向后挪动一个位置,再将想插入的数据放入下标为 pos 的位置即可

void SeqListInsert(SLT\* psl, size\_t pos, SQDataType x)
{
	assert(psl);
	assert(pos <= psl->size && pos >= 0); //保证插入的位置合理
	SeqListCheckCapacity(psl); //插入前检查容量的大小
	int end = psl->size;
	while (end > pos)
	{
		psl->a[end] = psl->a[end - 1];//表中的数据依次按从后向前的方式向后挪动
		end--;
	}
	psl->a[pos] = x;
	psl->size++; //插入完后表中数据个数 +1
}

删除数据

头删

头删只需将表中从第二个数据开始到最后一个数据都向前挪动一个位置,将第一个数据覆盖即可,然后整个表的数据个数减少一个

void SeqListPopFront(SLT\* psl)
{
	assert(psl);
	int begin = 1;
	for (begin = 1; begin < psl->size; begin++)
	{
		psl->a[begin - 1] = psl->a[begin];//表中的数据依次按从前向后的方式向前挪动
	}
	psl->size--; //删除后数据-1
}

尾删

实现起来非常简单,直接减掉最后一个数据即可(若要显示表的内容,则减去一个数据后,显示前size-1个数据即可)

void SeqListPopBack(SLT\* ps1)
{
	assert(ps1);
	ps1->size--;
}

特定位置删除

给定一个表中下标为 pos 的特定位置,删除该位置的数据只需将从将从该位置后的一个数据到表末的所有数据向前挪动一个位置,即将该pos处位置的数据覆盖即可

void SeqListErase(SLT\* psl, size\_t pos)
{
	assert(psl);
	assert(pos < psl->size&& pos >= 0); //保证下标pos的合理性
	int begin = pos;
	while (begin < psl->size)
	{
		psl->a[begin] = psl->a[begin + 1];//数据依次按从前向后的方式向前挪动
		begin++;
	}
	psl->size--; //删除后数据-1
}

顺序表查找

即查找顺序表中特定位置 (下标为pos) 的数据,实现起来比较容易,将整个表遍历一遍即可

int SeqListFind(SLT\* psl, SQDataType x)
{
	assert(psl);
	int i = 0;
	for (i = 0; i < psl->size; i++)
	{
		if (psl->a[i] == x)
		{
			return i; //若找到该数据,则返回该数据的下标
		}
	}
	return -1; //若没有该数据,则返回-1
}

顺序表修改

即修改特定位置 (下标为pos) 的数据,在保证位置合理的情况下将要修改的值赋给该位置上的数据即可

void SeqListAt(SLT\* psl, size\_t pos, SQDataType x)
{
	assert(psl);
	assert(pos < psl->size&& pos >= 0);
	psl->a[pos] = x;
}



![img](https://img-blog.csdnimg.cn/img_convert/523a3b6361bb533a7d85c899777e847c.png)
![img](https://img-blog.csdnimg.cn/img_convert/d2f8c793839fd3d860b381bebbc62409.png)

**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**[需要这份系统化资料的朋友,可以戳这里获取](https://bbs.csdn.net/topics/618545628)**


**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

止,不再深入研究,那么很难做到真正的技术提升。**

**[需要这份系统化资料的朋友,可以戳这里获取](https://bbs.csdn.net/topics/618545628)**


**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值