数据结构-静态顺序表

目录

静态顺序表的概念及结构

概念

结构

静态顺序表的初始化与销毁 

静态顺序表的尾插尾删,头插头删

SeqListPushBack

​SeqListPopBack

SeqListPushFront

SeqListPopFront

静态顺序表的插入与删除

插入操作

删除操作

 静态顺序表的按值查找与修改


静态顺序表的概念及结构

概念

   线性表的顺序存储又称顺序表。它是用一组地址连续的存储单元依次存储线性表中的数据元素,从而使得逻辑上相邻的两个元素在物理位置上也相邻。顺序表的特点是表中元素的逻辑结构顺序与物理结构顺序相同。

   顺序表又分为静态顺序表和动态顺序表。对于静态顺序表,在静态分配时,由于数组的大小和空间事先已经固定好了,一旦空间占满,再加入新的数据就会产生溢出,进而导致程序崩溃。

结构

   需要定义一个常量宏来确定静态顺序表的最大容量。 

   为了方便之后修改静态顺序表存储的数据类型,可以对静态顺序表的数据类型重命名。 

 因为我们的静态顺序表是用长度固定的数组进行表示的,所以我们还需要一个变量来记录数组中已经存储数据元素的个数。

   对于静态顺序表的结构,我们还可以使用C++的类与模板的知识来表示。

静态顺序表的初始化与销毁 

   其实静态顺序表的初始化和销毁很简单,几乎什么都不用做,无非就是初始化需要将size赋值为0,而这一步操作对于销毁是可有可无的。

静态顺序表的尾插尾删,头插头删

SeqListPushBack

   既然要插入数据,那么在插入数据之前就应该检查当前的空间是否够不够,如何检查当前的空间是否足够呢? 

   所以判断当前的空间是否足够的条件是size是否等于MAXSIZE,如果size小于MAXSIZE说明当前的空间足够,若size等于MAXSIZE则说明当前的空间不足。

   检查完空间是否足够之后,便可以进行数据的插入了。 

SeqListPopBack

   尾删的操作很简单,只需要将size--就行,但是在删除之前需要检查数组是否为空,如果为空就不需要进行删除的操作。

   所以为了判断静态顺序表是否为空,可以写一个函数进行判断。如果函数返回真,则说明顺序表为空,若函数返回假,则说明顺序表不为空。

   尾删的操作,如果数组为空,则进入if语句。

SeqListPushFront

   进行头插的操作,需要进行数据的挪动,将所有的数据往后移动一个位置。

SeqListPopFront

   关于头删的操作,我们要明白静态顺序表的数据必须要从数组下标为0的位置开始存储。所以头删的操作,我们要进行数据的覆盖。

静态顺序表的插入与删除

插入操作

   在静态顺序表中的第i个位置之前插入新元素x。若输入i的位置不合法,则返回false,表示插入失败;否则,将第i个元素及其后面的所有元素依次往后移动一个位置,腾出一个空位置插入新元素x,顺序表的长度增加1,插入成功,返回true;这里的i是指位序。

    插入操作的平均时间复杂度是O(n),最好的情况是在表尾插入,元素后移语句将不执行,时间复杂度为O(1);最坏的情况是在表头插入,元素后移语句将执行n次,时间复杂度为O(n)(n为元素的个数,i为位序)。

删除操作

   删除静态顺序表中的第i个位置的元素,若删除的位置不合法或者数组为空返回false;否则,将i+1个元素及其后面的元素依次往前移动一个位置,并返回true。

    静态顺序表删除操作的平均时间复杂度为O(n),最好的情况是删除表尾的数据,无须移动元素,时间复杂度为O(1);最坏的情况是删除表头的数据,需要移动除表头元素外的所以元素,时间复杂度为O(n)。

   实现了插入与删除的接口,我们在进行尾插尾删,头插头删时,可以复用插入与删除的接口。

 静态顺序表的按值查找与修改

   在静态顺序表中查找元素值为x的元素,如果查找成功返回其元素的下标,否则返回-1。查找的过程我们只需要将静态顺序表遍历一次就行,每次与元素x进行比较。

 按值查找的平均空间复杂度为O(n)。最好情况:查找的元素就在表头,仅需要比较一次,时间复杂度为O(1)。最坏情况:查找的元素在表尾,需要比较n次,时间复杂度为O(n)。

   修改的操作也有很多实现的方法,这次我们实现的方法是搭配查找来使用的。

   因为SeqListFind返回的是下标,而int i 表示的是顺序表的位序也就是第几个位置。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值