首页 > 其他分享 >实现顺序表的增删查改

实现顺序表的增删查改

时间:2024-04-08 14:33:30浏览次数:32  
标签:顺序 下标 pos 插入 查改 增删 我们 size

首先什么是顺序表呢?

顺序表的底层结构是数组,对数组的封装,实现了常用的增删改查等接口。

顺序表分为静态顺序表和动态顺序表

~静态顺序表就是使用定长数组存储元素,这里有一个很大的缺陷,那就是空间给少了不够用,给多了造成空间浪费。

所以。这里我们就来使用动态顺序表来实现增删查改等操作

首先我们创建一个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

相关文章

  • 【数据结构(二)】顺序表与ArrayList
    ❣博主主页:33的博客❣▶文章专栏分类:数据结构◀......
  • 顺序表专题
    欧克,今天就让我们小小来看个顺序表吧!目录顺序表1、顺序表的概念及结构1.1线性表2、顺序表分类静态顺序表动态顺序表----按需申请3.动态顺序表的实现1.顺序表的初始化2.顺序表的销毁3.顺序表尾插4.头插5.尾删6.头删7.指定位置插入8.指定位置删除9.查找指定元......
  • 通讯录----顺序表版本
    1.通讯录的实现逻辑对于通讯录,我们做的无非就是初始化,销毁。添加联系人数据,修改联系人数据,删除联系人数据,查找联系人数据,展示联系人数据;这个不就和我们的顺序表的逻辑如出一辙吗,顺序表实现的功能不就是数据的初始化,修改,删除(头删和尾删),添加(头插和尾插),顺序表的打印,这些我们是可......
  • 数据结构之顺序表
    目录一、顺序表源代码1.1SeqList.h1.2SeqList.c二、顺序表的应用2.1Contact.h2.2Contact.c2.3SeqList.h2.4SeqList.c2.5main.c一、顺序表源代码顺序表的底层实现为数组,源代码以整形数据为例,使用C语言编写1.1SeqList.htypedefintSLDataType;//动态顺......
  • 顺序栈功能函数(包括判断回文、数值转化、括号匹配)
    一,具体代码#include<iostream>#include<stdlib.h>usingnamespacestd;#defineOK1#defineERROR0#defineMAXSIZE100typedefintElemType;typedefintStatus;typedefstruct {   ElemType*elem;   inttop;}Sqstack;StatusInitStack(Sqstack......
  • 顺序栈和链栈的部分功能完整代码
    一、顺序栈代码#include<iostream>#include<stdlib.h>usingnamespacestd;#defineOK1#defineERROR0#defineMAXSIZE100typedefintElemType;typedefintStatus;typedefstruct {   ElemType*elem;   inttop;}Sqstack;StatusInitStack(Sqsta......
  • 1600. 王位继承顺序
    题面核心思想纯模拟!没反应过来是前序遍历~privateMap<String,List<String>>children;表示一个人的孩子当调用getInheritanceOrder时通过map搜索答案,由于孩子也有可能有孩子,无限套娃,所以通过递归搜索建立答案。建立答案的时候也不用考虑是否死亡,我们搜索完成后在去删除......
  • 【C语言】顺序表(原理+实现)
    一.原理1.线性表、顺序表线性表(Linearlist)是n个具有相同特性的数据元素的有限序列。线性表在逻辑上是线性结构,就如同一条连续的直线,但是在物理结构上不一定是连续的。顺序表(Sequencelist)是线性表的一种,但顺序表不仅在逻辑上是线性的,它在物理上同样是线性的。顺序表的底层......
  • 简单顺序链- - 将第一个链的输出作为第二个链的输入
    fromlangchain.chainsimportLLMChain,SimpleSequentialChain#简单序列链fromlangchain_community.llms.ollamaimportOllamafromlangchain_core.promptsimportPromptTemplatellm=Ollama(model="qwen:7b")template="""您的工作是根据用户建议的区域制......
  • JAVA入门——对象数组:对象数组进行增删改查
    题目:不使用数据库,定义长度为3的数组,存储1~3名学生对象作为初始值(即1名2名3名都可以),学生对象的学号具有唯一性。学生属性:学号,姓名,年龄。要求一:再添加一个学生对象,遍历所有学生要求二:通过学号删除学生信息,遍历所有学生要求三:通过学号查询学生信息,若存在则修改年龄,遍历所有......