线性表元素的基本操作(插入、查找和删除等)【数据结构】_线性表在第几个位置插入和删除编程-程序员宅基地

技术标签: c语言  数据结构  开发语言  

上一篇我们已经说过了线性表的基本实现,包括创建线性表和遍历线性表。

线性表的基本实现快速通道:

https://blog.csdn.net/Wanghh520max/article/details/137127478

本次我们来讲述对线性表进行插入和删除元素操作。

一、顺序表插入元素

向已有顺序表中插入数据元素,根据插入位置的不同,可以分为以下 3 种情况:

  1. 插入到顺序表的表头;
  2. 在表的中间位置插入元素;
  3. 尾随顺序表中已有元素,作为顺序表中的最后一个元素;

虽然数据元素插入顺序表中的位置有所不同,但是都使用的是同一种方式去解决,

即:通过遍历,找到数据元素要插入的位置,然后做如下两步工作:

  • 将要插入位置元素以及后续的元素整体向后移动一个位置;
  • 将元素放到腾出来的位置上;

例如:在{1,2,4,5,6}的第3个位置插入元素3,实现过程如下图所示:

首先遍历线性表到指定位置,即位置3.

接下来将位置3及后面的元素依次后移,空出位置3的位置。

现在我们便可以向位置3中插入指定元素3,同时线性表的长度要动态增加一。

向线性表中插入元素的代码实现如下:

SqList *Insert_SqList_tail(SqList *L) {

    //判断此时线性表是否已满
    if (L->length >= MaxSize) {
        printf("线性表已满!");
        return 0;
    } else {
       
        int site;
        printf("请输入添加元素的位置:");     //自定义添加元素位置
        scanf("%d",&site);

        int num;                            //输入需要添加的元素
        printf("请输入需要添加的元素:");
        scanf("%d", &num);
        int i;
        for(i = L->length; i>=site; i--){
            L->data[i] = L->data[i -1];      //遍历到要插入元素的所在位置,
            }                                //并将目标位置后面的元素后移

        L->data[site - 1] =num;              //添加目标元素到线性表中

        L->length ++;                        //线性表长度增加1
    }
    return L;
}

调用主函数测试函数:

int main() {
    SqList L;
    SqList *SP;
    SP = &L;
    Init_SqList(SP);

    PrintSqList(Create_SqList(SP));        //打印当前的线性表
    PrintSqList(Insert_SqList_tail(SP));    //打印成功添加元素后的线性表
    return 0;
}

增加程序的健壮性,要是线性表长度超过MaxSzie,则无法继续插入元素。

在{1,2,4,5,6}的第3个位置插入元素3,结果如下:

二、线性表元素的查找

线性表的查找可以分为两种:按值查找和按位查找

1.按值查找

该操作是给定需要查找的元素,然后遍历线性表比较线性表中的元素是否和目标元素相等。

其时间复杂度为:

最好的情况:目标元素在表头

                        循环一次便可找到目标元素,时间复杂度为O(1)

最坏的情况:目标元素在表尾

                      需要遍历整个线性表才可找到,循环n次,时间复杂度为O(n)

平均情况:假设目标元素出现在线性表的任何一个位置的概率都相同,均是n^{-1}

     目标元素在第1位,循环1次;在第2位,循环2次;……; 在第 n 位,循环 n 次           平均复杂度为O(n)             

代码实现,我们只需遍历线性表即可。

//按值查找的代码实现
void GetElem(SqList *L) {
    int num;
    printf("请输入需要查找的元素:");
    scanf("%d", &num);
    int i;
    for (i = 0; i < L->length - 1; i++) {
        if (L->data[i] == num) {

            printf("目标元素%d排列在线性表的第%d号位置\n", num, i + 1); 
            //返回的是线性表的位置,所以返回的i值需要在数组下标的基础上加1

        }
    }
}

若找到了则返回元素所在位置。

例:在线性表{1,2,3,4,5,6,7,8}中查找元素{5}的位置

2.按位查找

由于顺序表的各个数据元素在内存中连续存放,因此可以根据起始地址和数据元素大小立即找到第 i 个元素--“随机存取”特性。

所以按位查找的时间复杂度为O(1),一次便可以找到。

代码实现,输入目标位置即可得到目标元素。

//按位查找的代码实现
void GetElem(SqList *L) {
    int site;
    printf("请输入需要查找的位置:");
    scanf("%d", &site);
    while (true) {

         //判断查找位置的合法性
        if (site < 1 || site > L->length) {
            //如果不合法则重新输入

            printf("输入位置不合法!\n请重新输入");
            printf("输入需要查找的位置:");
            scanf("%d", &site);
        } else {

            int num = L->data[site - 1];    //注意线性表和数组下标引用的区别

            printf("排列在线性表第%d号位置的元素是%d\n", site, num);
            break;
        }
    }
}

若存在则返回元素所在位置,如果输入的位置非法则给出反馈并重新输入。

例:在线性表{1,2,3,4,5,6,7,8}中查找位于第5号的元素。

健壮性测试,输入非法位置直到合法位置后查找并退出。

三、线性表的删除操作

删除表L中第i个位置的元素,并用e返回删除元素的值。

最好情况:删除表尾元素,不需要移动其他元素。i=n,循环0次;

               最好时间复杂度=0(1)

最坏情况:删除表头元素,需要将后续的n-1个元素全都向前移动i= 1,循环 n-1 次;

               最坏时间复杂度=0(n);
平均情况:假设删除任何一个元素的概率相同,即i= 1,2,3,…,length 的概率都是p=1/n;

                i=1,循环 n-1 次;i=2 时,循环 n-2 次;i=3,循环 n-3 次 …i=n 时,循环0次

                平均时间复杂度=0(n)

代码实现,此时返回指针类型,可以在main函数中打印返回以观察是否删除成功。

//线性表删除元素操作
int *DeleteSqList(SqList *L) { 
    int j;
    int site;
    printf("请输入需要删除元素的位置:");
    scanf("%d", &site);
    if (site < 1 || site > L->length) { //删除位置不合法
        return 0;
    }
    int *num = (int *) L->data[site - 1]; //接收目标位置的元素
    for (j = site + 1; j <= L->length; j++)
        L->data[j - 1] = L->data[j];

    --L->length; // 线性表的长度减少
    return num;
}

//main函数调用函数
int main() {
    SqList L;
    SqList *SP;
    SP = &L;
    Init_SqList(SP);

    PrintSqList(Create_SqList(SP));

    int *num = DeleteSqList(SP);
    if (num != 0) {
        printf("成功删除元素%d\n", num);
    } else {
        printf("删除失败!\n");
    }
    return 0;
}

例:在线性表{1,2,3,4,5,6,7,8}中删除第5号的元素.

以上便是线性表的基本操作!

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/Wanghh520max/article/details/137128308

智能推荐

ssm基于JAVA的驾校信息管理系统设计论文_驾校管理系统的设计与实现论文近五年参考文献-程序员宅基地

文章浏览阅读787次,点赞26次,收藏26次。独立开发程序期间,才会发现有许多知识都是现学现用得来的,毕竟大学期间所学知识比较有限,专业知识掌握得比较浅显,这也给自己制造了许多麻烦,比如程序开发期间遇到的中文乱码问题,程序对应数据库的数据安全问题,程序开发中框架的使用问题等,这些问题都需要随时去翻阅书籍,或通过百度浏览器等方式寻找解决办法,这也耽误了许多程序开发的宝贵时间,后期我也通过对周边同学的请教,以及指导老师的悉心指导,让我找到了程序开发的相关技巧,也积累了一定的知识量,慢慢地纠正了许多不该犯的错误。也推动了我的程序开发进程。_驾校管理系统的设计与实现论文近五年参考文献

Kafka学习笔记(二、linux和docker安装及使用demo)

第一个总是Kafka Connect进程的配置,包含常见的配置,比如Kafka要连接的代理和数据的序列化格式。这些示例配置文件,包含在Kafka中,使用您之前启动的默认本地集群配置并创建两个连接器:第一个是源连接器,它从输入文件中读取行并将每个行生成到Kafka主题,第二个是接收器连接器,它从Kafka主题中读取消息并将每个消息作为输出文件中的一行生成。下面我们介绍如何使用简单的连接器来运行Kafka Connect,将数据从文件导入到Kafka主题,并将数据从Kafka主题导出到文件。

Java创建对象的最佳方式:单例模式(Singleton)

单例模式是java中最简单的设计模式之一,属于创建式模式,提供了一种创建对象的最佳方式。具体而言,单例模式涉及到一个具体的类,这个类可以确保只有单个对象被创建。它包含一个访问其唯一对象的方法,供外部直接调用,而不需要创建这个类的示例。简而言之,可以不再new一个他的实例,而是直接调用方法。

基于STM32F103的增量式PI算法_通过pi控制算法得到的增量怎么转化为pwm的频率-程序员宅基地

文章浏览阅读2.7k次。增量式PI的程序百度一搜由算法可以看出,主要是误差参与运算,控制量可以理解为误差的累计和消除过程,比如第一次调节有误差1,第二次调节有误差2,误差2的出现说明第一次调节没有调整到给定值,控制量在第二次会改变,这样继续调节下去,调整到给定值时候,理论上是0了。比例积分系数和控制量的关系比例可认为是快速到达给定值积分可认为是消除稳态误差一般的系统,PI就够用了基本思路1初始化给定值,或是外部给予2实时采样被控对象3采样值与外部给予比较,并进行算法处理,得到控制量4由控_通过pi控制算法得到的增量怎么转化为pwm的频率

Ansible自动化运维工具主机清单配置

Ansible 提供了多种方式来定义和管理主机列表,除了默认的文件之外,您还可以使用自定义主机列表。这提供了更大的灵活性,允许您根据需要从不同来源获取主机信息。

堆栈的实现(C语言)_c语言堆栈-程序员宅基地

文章浏览阅读1.8k次,点赞6次,收藏36次。堆栈(stack)的基本概念堆栈是一种特殊的线性表,堆栈的数据元素及数据元素之间的逻辑关系和线性表完全相同,其差别是:线性表允许在任意位置插入和删除数据元素操作,而堆栈只允许在固定一端进行插入和删除数据元素操作。 堆栈中允许进行插入和删除数据元素操作的一端称为栈顶,另一端称为栈底。栈顶的当前位置是动态的,用于标记栈顶当前位置的变量称为栈顶指示器(或栈顶指针)。 堆栈的插入操作通常称为进栈或入栈,每次进栈的数据元素都放在原当前栈顶元素之前而成为新的栈顶元素。堆栈的删除操作通常称为出栈或退栈,每次出栈的_c语言堆栈

随便推点

Ansible-Tower安装破解

Ansible-Tower安装破解。

如何使用 Nginx 进行负载均衡

通过使用 Nginx 进行负载均衡,您可以提高应用的可靠性和性能。上述指南提供了设置负载均衡的基础步骤,您可以根据具体需求对其进行调整和扩展。确保定期检查和更新您的 Nginx 配置以保持最优性能。希望这篇博客能帮助您开始使用 Nginx 进行负载均衡!如果您有任何问题或需要进一步的帮助,请留言或联系我们。

ARFoundation系列讲解 - 39 AR看车六_arfoundation 关闭动画位移计算-程序员宅基地

文章浏览阅读1k次。十二、播放模型动画1.这里我们要做的是第一次点击中心按钮播放打开车门动画,第二次点击中心按钮关闭车门动画。2.新建一个脚本,命名为“AnimationManager.cs”。(代码如下)using System.Collections.Generic;using UnityEngine;/// <summary>动画管理</summary>public class AnimationManager : MonoBehaviour{ /// <s._arfoundation 关闭动画位移计算

Idea 运行spring项目 出现的bug_idea spring代理对象出bug-程序员宅基地

文章浏览阅读220次。Idea 运行spring项目 出现的bugbug 1错误信息:Cannot start compilation: the output path is not specified for module “02_primary”.Specify the output path in the Project Structure dialog.解决办法:..._idea spring代理对象出bug

JavaFx基础学习【四】:UI控件的通用属性_javafx教程-ui控件-程序员宅基地

文章浏览阅读1k次,点赞2次,收藏6次。Node,就是节点,在整体结构中,就是黄色那一块,红色也算个人理解,在实际中,Node可以说是我们的UI页面上的每一个节点了,比如按钮、标签之类的控件,而这些控件,大多都是有一些通用属性的,以下简单介绍一下。_javafx教程-ui控件

【嵌入式Linux】03-Ubuntu-文件系统结构_嵌入式linux使用ubuntu文件系统-程序员宅基地

文章浏览阅读136次。此笔记由个人整理塞上苍鹰_fly课程来自:正点原子_手把手教你学Linux一、文件系统结构g根目录:Linux下“/”就是根目录!所有的目录都是由根目录衍生出来的。/bin存放二进制可执行文件,这些命令在单用户模式下也能够使用。可以被root和一般的账号使用。/bootUbuntu内核和启动文件,比如vmlinuz-xxx。gurb引导装载程序。/dev设备驱动文件/etc存放一些系统配置文件,比如用户账号和密码文件,各种服务的起始地址。._嵌入式linux使用ubuntu文件系统

推荐文章

热门文章

相关标签