前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【数据结构】顺序表的增删改查

【数据结构】顺序表的增删改查

作者头像
程序员周同学
发布2019-07-23 10:41:52
1.4K0
发布2019-07-23 10:41:52
举报
文章被收录于专栏:程序员周同学程序员周同学

微信公众号:程序员周同学 关注可了解更多的教程及编程技巧。问题或建议,请公众号后台留言; 如果你觉得对你有帮助,欢迎点赞

内容目录

写在前面顺序表如何增添数据?顺序表如何删除数据?顺序表的查改操作总结

写在前面

本文所有操作均基于以下代码

#include<stdio.h>
typedef int DataType;
const int MAXSIZE = ;
typedef struct{
    DataType List[MAXSIZE];
    int size;
}SeqList;
int main(){
    SeqList seqList;
    //文章中增删改查均用函数实现
}

在上篇文章中[数据结构]线性表的顺序表示中我已经介绍了顺序表的特点。在今天这篇文章中我将带大家完成顺序表的增删改查四个基本操作

顺序表如何增添数据?

顺序表的插入方式有两种:

  1. 指定下标处插入数据,需要判断下标是否合理
  2. 不指定下标位置,直接在末尾添加数据

首先我们假设顺序表,最大存储个数MAXSIZE设置为20,且顺序表中已经添加了5个数据。 我们要将一个新的数据data插入到下标index=2处。

图注:假设前提 第一步:将下标index=2,且下标大于2的数据,均向后移动一位,且必须从最后一个数据开始移动。

图注:数据的移动过程移动操作代码如下:

    //必须从最后一位开始移动,想想为什么?
    for (int j = seqList->size; j > index; --j)
        seqList->List[j] = seqList->List[j-1];

第二步:将下标index=2的数据赋值为data,并将顺序表的大小size加一

代码如下:

    seqList->List[index] = data;
    seqList->size ++;

综合以上代码,我们得到实现顺序表增添操作的函数insertSeqList

/**
 * @param seqList 顺序表的地址
 * @param index 插入数据的位置
 * @param data 需要插入的数据
 */
//此处如果直接传入顺序表,在函数运行结束后,并不会改变原顺序表的值。必须传入顺序表的地址
void insertSeqList(SeqList* seqList,int index,DataType data)
{
    //当顺序表大小超过最大储存大小时,无法插入数据
    if (seqList->size >= MAXSIZE){
        printf("顺序表已满!无法插入数据!");
        return;
    }
    //当下标小于0或者大于顺序表的大小时,下标index不合法,无法正常插入数据
    //也可将不合法时,默认为在末尾插入数据.将if中的注释去掉即可
    if(index<||index>seqList->size){
        printf("插入位置不合法!");
        //seqList->List[seqList->size] = data;
        //seqList->size++;
    }
    else{
        //循环后移数据
        for (int j = seqList->size; j > index; --j)
            seqList->List[j] = seqList->List[j-1];
        //将数据插入顺序表
        seqList->List[index] = data;
        //顺序表大小加一
        seqList->size ++;
    }
}

顺序表如何删除数据?

顺序表删除数据同样也有两种方法:

  1. 根据下标删除数据
  2. 根据传入的DataType删除数据

这里主要考虑第二种情况,根据传入数据的值来删除数据(其中逻辑包含第一种删除方式) 在上一小节顺序表如何插入数据中,我们已经知道了,在插入数据时,我们必须给插入的数据留下一个空位,向后面的数据向后移动一位,使之能够顺利插入顺序表。而删除是插入的反向操作,所以很容易想到,在删除顺序表数据时,我们就要将需要删除的数据之后的数据均向前移动一位,覆盖要删除的数据。同样以顺序表中有五个数据为例,删除数据也分为两步:

图注:删除数据的第一步 代码演示:

    int index;//声明一个int型变量index,用于保存下标
    for (int i = ; i < seqList->size; ++i) {
        if (seqList->List[i] == data){
            //若找到了想删除的数据,则把下标赋值给index
            index = i;
            break;
        }else
            //index = -1表示未找到想删除的数据
            index = -1;
    }

图注:移动过程 代码演示:

//循环向前移动
for (int i = index; i < seqList->size; ++i)
    seqList->List[i] = seqList->List[i + ];
seqList->size--;//移动结束后,顺序表大小减一

综上,删除顺序表中数据的函数deleteSeqListData实现方式如下:

//如果想删除指定下标的元素,则先判断传入的下标值是否合理,再使用最后一个for循环将数据移动
void deleteSeqListData(SeqList* seqList, int data) {
        //当顺序表中没有数据时,直接返回
    if (seqList->size <= )
        return;
    int index;
        //查找数据
    for (int i = ; i < seqList->size; ++i) {
        if (seqList->List[i] == data) {
            index = i;
            break;
        }
        else
            index = -1;
    }
    if (index == -1)
        return;//如果没有找到数据直接return;
        //将数据循环向前移动一位
    for (int i = index; i < seqList->size; ++i)
        seqList->List[i] = seqList->List[i + ];
        //移动之后顺序表的大小减一
    seqList->size--;
}

我写的方法与课本上有所不同,我们来看看课本上的删除写法,我加上注释方便大家理解:

/**
 * 
 * @param seqList 顺序表的地址
 * @param index 需要删除的下标值
 * @param data 用于保存删除的数据,因为传入的是地址,所以无需return,在主函数中直接会被修改
 * @return 0 表示未删除成功 ;1 表示删除成功
 */
int ListDelete(SeqList* seqList,int index,DataType* data) {
    //判断顺序表中是否还有数据
    if (seqList->size <= ){
        printf("顺序表为空,无值可删除!");    
        return ;
    }
    //判断下标值是否合法
    else if(index <  || index > seqList->size-1){
        printf("下标值不合法!");
        return ;
    }else{
        //将要删除的元素赋值给data,data为地址值,所以在主函数中也会被修改,而非形式参数
        *data = seqList->List[index];
        //循环赋值
        for (int i = index; i < seqList->size; ++i)
            seqList->List[i] = seqList->List[i + ];
        return ;
    }
}

顺序表的查改操作

这两个操作应该是最简单的了,这里就不做过多的描述了。看一下书上的查找代码

//查
int getSeqListData(SeqList* seqList,DataType data){
    for (int i = ; i < seqList->size; ++i) {
        if (seqList->List[i] == data)
            return i;//找到了则返回数据的下标
    }
    //没找到则返回-1
    return -1;
}
//改,在查找的基础上直接做修改
int updateSeqListData(SeqList* seqList,DataType oldData,DataType newData){
    //首先查找需要修改的数据的下标
    int index;
    for (int i = ; i < seqList->size; ++i) {
        if (seqList->List[i] == oldData){
            index = i;
            break;
        } else
            index = -1;
    }
    //没找到直接return
    if (index == -1)
        return ;
    else{
    //找到了就将该数据赋值为newData
        seqList->List[index] = newData;
        return ;
    }
}

总结

顺序表是数据结构中最简单的一种,但它也可以实现很多生活中常见的情形,比如:已知班上的人数固定,需要保存成绩等信息,我们就可以用到顺序表,方便查找数据。 大家可以根据自己的喜好,来写一个小程序,加上文件操作实现相关功能。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-07-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序员周同学 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 内容目录
  • 写在前面
  • 顺序表如何增添数据?
  • 顺序表如何删除数据?
  • 顺序表的查改操作
  • 总结
相关产品与服务
云开发 CloudBase
云开发(Tencent CloudBase,TCB)是腾讯云提供的云原生一体化开发环境和工具平台,为200万+企业和开发者提供高可用、自动弹性扩缩的后端云服务,可用于云端一体化开发多种端应用(小程序、公众号、Web 应用等),避免了应用开发过程中繁琐的服务器搭建及运维,开发者可以专注于业务逻辑的实现,开发门槛更低,效率更高。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档