首先什么是顺序表呢?
顺序表的底层结构是数组,对数组的封装,实现了常用的增删改查等接口。
顺序表分为静态顺序表和动态顺序表
~静态顺序表就是使用定长数组存储元素,这里有一个很大的缺陷,那就是空间给少了不够用,给多了造成空间浪费。
所以。这里我们就来使用动态顺序表来实现增删查改等操作
首先我们创建一个SeqList.h的头文件和一个SeqList.c的源文件。
我们在头文件中进行对函数的声明,首先我们定义一个自定义类型的结构体,这个结构体就是动态顺序表,结构体成员分别为SLDataType* arr,int size, int capacity。
注意我们这里对int进行重定义为SLDateType,我们对顺序表操作数据时不一定就是整型,也可以其他内置类型如字符型,如果我们将它写死为int* arr,那么后续要修改时就非常繁琐,而对Int进行重定义,在后续要修改时我们直接将int改为我们所需要的类型,只需要修改一行代码即可。
在SeqList.c文件中我们对函数进行定义,以下为顺序表的初始化和销毁
我们在插入数据之前需要判断空间够不够,不够的话就要申请空间,那么需要申请多大的空间呢?一般我们都是成倍的申请空间,由于我们初始化时空间capacity大小为0(当然可根据个人喜好,你也可以初始化一个非0空间,但是空间非0时也要malloc申请一块空间)因此这里可以使用三目操作符,如果我们空间初始化为0,那我们默认给他一个4个整型大小的空间。
代码如下:
检查完后我们先进行尾插,
第一个参数为我们定义的结构体类型的指针ps(也就是我们的动态顺序表的地址),第二个参数是我们要插入的数据x。
ps->arr[ps->size++] = x;
其实就相当于先插入数据,ps->arr[ps->size]=x;
然后再加加,ps->size++
然后我们再写一个打印方法,当然也可以调试,这里我们方便展示直接打印出来查看。这里我们创建了一个test.c的源文件用来测试。
尾插结果打印出来如下:
接下来我们进行头插,头插我们需要先将顺序表中已有的数据整体往后移动一位
我们来看一下测试运行
这里我们发现运行结果为6 5 1 2,头插的话在1 2 3 4前插入5,6,那应该是6 5 1 2 3 4啊。那么说明我们头插这里出现了错误,此时我们这里应该出现6个数据结果漏掉了2个,只有4个,很明显我们size忘记++了。
现在就没有问题了。
插入完成之后我们来实现删除操作
首先是尾删,注意顺序表为空时不能执行删除操作,因为在size为0时,顺序表下标为size-1,此时下标为-1,而下标不能为负数。
我们来运行测试一下
我们再来测试一下size为0时
显然此时会报错终止运行
头删
头删和头插是类似的,从下标1开始往前移动一位,注意不要从最后下标为size-1处开始往前移动不然数据会被覆盖
测试运行一下:
指定位置插入和删除
指定位置的插入
这里和头插尾插相比多了一个参数int pos,表示在下标pos处插入x,注意pos不能为负数也不能大于size,插入前要先将pos后的数据整体向后移动一位。
测试运行一下:
pos为0时相当于头插,pos等于size时相当于尾插
指定位置删除
和指定位置插入类似,但是pos不能等于size,pos后面整体数据向前移动一位进行覆盖,pos处的数据被覆盖相当于被删除。
运行测试一下:
最后我们来实现查找功能
我们循环遍历顺序表,找到了就返回这个数所在的下标;没找到就返回-1.
运行测试一下
这里我们查找3,返回下标2;查找66,没有此数据返回-1,打印输出没找到
好了,实现顺序表的增删查改就到这里了,下一次我们来实现顺序表的应用----基于顺序表实现通讯录项目(最后纠正我的一个小错误,我的SLDataType,在写代码时不小心写成了SLDateType,当然也不影响我们的顺序表实现)
标签:顺序,下标,pos,插入,查改,增删,我们,size From: https://blog.csdn.net/2402_82670467/article/details/137346476