数据结构之顺序表

目录:
      1.顺序表的定义
     2.顺序表的实现  
 1.顺序表的定义
     什么是顺序表?知:C语言中,数组的长度是在创建之初就已经确定了的,但是,若数组创建前,无法确定该数组需要使用的长度,该为数组开多大的空间呢?是为确保空间足够大,开1000?10000?还是更大?还是为避免浪费,开的空间小一点?
     面临该情形,我们可以做个猜想,能否使数组起初开辟的空间较小,当数组满了,空间不够用了,再给它扩容呢?
     由于数组的大小是可能改变的,所以我们需要一个变量——能够告诉我们此时数组的大小,我们给它起名capacity(容量);我们还需要另一个变量——能够告诉我们数组已经存放了多少个元素,我们叫它size(个数)。
     那么,由一个可变数组,两个变量组成的一个整体,将其放入一个结构体中,我们就称这个结构体为动态顺序表。如图:
                                                                 
    图中SL是顺序表(sequence list)的简称,Datetype意为顺序表数组内元素的类型   由于数组内的元素可以是int,char,double...等类型 所以我们不要将其写死,用#define 来定义其数据类型,方便我们日后更改。
2.顺序表的实现
    该如何实现这个动态顺序表呢?或者说,如果我们想对这个顺序表进行增,删,查,改等功能要怎么做呢?
    用函数,用一个个函数去完成上述的功能,如下为函数的声明
                 
    首先,何为初始化顺序表?即为顺序表内的变量(可变数组或者说指针,size和capacity)赋一个初始值,要想使该数组能够扩容,我们就需要使用动态内存开辟的空间,初始时可以先开辟四个元素的空间,此时该数组的capacity(容积)为4,数组内暂无元素,故size为0,所以该函数的定义如下:
                      
    所谓“有借有还”,当数组用完之后,咱总得把借来的空间给还回去吧?这就是销毁顺序表该干的事儿了,那么如何"还"回来? 简单,把开辟的空间free掉,此时这个数组已经“名存实亡”了,那么它的size(元素个数)就是0,capacity(容积)也是0,为了让它的"名"不被误用,咱们就把它的“名”也给弃除,即将arr置为空(NULL),函数定义如下:
                                              
    我们初始时给数组开辟了四个元素大小的空间,前几次增添元素可能没事,但总有一次数组会满,所以我们需要一个函数来为我们判断数组是否满了,判断标准是啥呢?首先,我们已经知道当前数组的元素个数(size)和数组的容积(capacity),那么当size==capacity时,数组不就满了吗?数组满了,咱们就需要扩容,一次扩充一倍的空间最为合适,同时更新扩容后数组的容积(capacity),函数定义如下:
           
    增添元素函数——SLInsert( SL* psl, int pos, SLDatatype x);首先,增添元素之前,需要调用函数来判断数组是否已经满了。为数组增添元素的位置有很多,可能是数组的开头,又可能是数组的末尾,也可能是数组中间的人一个位置,所以我们用pos来表示为数组增添元素的位置,同时判断所给的pos是否合法,要知道咱们是增添元素而不是更改元素,所以需要将pos位置及其后面的元素后移一个位置,然后再将pos位置赋值为目标元素x,完成上述操作后,数组的元素个数+1,数组容积不变,函数定义如下:
                                               
    删除元素函数,首先,将数组元素遍历一遍找到目标元素的位置,然后删除目标元素。元素的删除就是覆盖,从左往右移一个位置将目标元素覆盖即可,覆盖完成后,数组的元素个数-1,容积不变,函数定义如下:
                                                   
    查找元素,即将数组内的元素遍历一遍寻找目标元素,然后直接返回目标元素的下标即可。若遍历一遍后找不到目标元素,则在最后返回-1,函数的定义如下:
                                                                  
    改变元素,首先需要判断所给的位置是否合法,然后直接在数组中,将所给位置的元素覆盖成所给值即可,函数的定义如下:
                                                        
现在该顺序表就已经实现完成啦,试试效果?试试增添元素(0~9)
代码+运行结果:                                                   
                                                                                                                                     perfect! 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

雨中豪杰ˇ

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

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

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

打赏作者

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

抵扣说明:

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

余额充值