不定长(可扩容)顺序表

我们先来看不定长的顺序表的结构是什么

不定长(可扩容)顺序表_第1张图片

我们在前面定长为10的顺序表基础上,不定长就是如果前10个格子满了,就在它的表尾扩个容,例如再加10个格子,如果后面用完了就再接着加格子扩容。

那这样随时可能要扩容,等到后面你也不知道有多少个数据,没法用下标。所以要写一个指针指向elem的数据

然后这里跟定长的一样,需要一个length,来知道有效数据的个数。如果不知道数据哪些有效,哪些无效也就没办法实现对数据的增加与删除等的操作。

现阶段的结构体就变成了这样,上下2个格子,上面放指针(例如整型int)指向我们后面的动态内存地址(例如像上图刚开始指向一块10个格子大小的内存地址)。(这个跟前面定长的不一样的地方是,定长是int elem[10];而这里是int *elem,这里elem是这个指针的名字,也可以int *+别的名字,不在放具体的elem了)        下面放整型变量length显示我们有效数据的个数。

不定长(可扩容)顺序表_第2张图片不定长(可扩容)顺序表_第3张图片

现在的结构体就是这样了,那么这个能做到扩容吗——能的。那它能做到正常插入和删除数据吗——不能。

那就有个问题,如果10格子插入满了,如图

不定长(可扩容)顺序表_第4张图片

此时就需要扩容,那么我们怎么知道什么时候格子就插满了呢,扩容的前提是,计算机怎么判断格子是否满了。

所以解决不了插入和删除的原因就是不知如何判满。我们不知道总共放多少个数据它就满了,那我们就在结构体里面再加上一个数据成员,让它来知道放入多少个数据就代码格子满了。需要扩容了。

这第三个数据成员就是顺序表总共的长度(即总共的格子数)。叫作总容量,名字为listzise。

不定长(可扩容)顺序表_第5张图片

如图,第一次申请动态内存时,我申请了10格子,则总容量为10,一开始没插入数据时其length就为0.

然后我往图里的格子插入数据,不断length++,将数字9插入最后一个格子时,此时length的值就等于listsize的值,也就是说,有效数据的值==总容量的值时,这时我们就判断满了。

所以我们判满就是length是否等于listsize。

不定长(可扩容)顺序表_第6张图片

综上,我们的不定长的顺序表的最终结构就是如图所示。

接下来我们定义结构体就是看图写话了,第一个结构体成员就是指针(int * elem)

第二个就是有效数据长度(int length)

第三个就是总容量(int listsize)

你可能感兴趣的:(数据库)