909-2015-T1

文章目录

  • 1.原题
  • 2.算法思想
  • 3.关键代码
  • 4.完整代码
  • 5.运行结果

1.原题

线性表使用公式化描述方式存储。编写一个函数,从一给定的线性表A中删除值在x ~ y(x到y,x<=y)之间的所有元素,要求以较高的效率来实现。提示:可以先将线性表中所有值在x~y之间的元素置成一个特殊的值,并不立即删除它们,然后从最后向前依次扫描,发现具有特殊值的元素后,移动其后面的元素将其删除掉。

2.算法思想

不需要管提示,有更好的算法。对于在x ~ y之间的元素,不需要管。对于不在x ~ y之间的元素,移动到指定的位置。通过双指针来实现,这样免去了每次删除的复杂操作,降低时间复杂度

3.关键代码

typedef struct {
    int data[MAX_SIZE]; /**< 用数组存储线性表的元素 */
    int length; /**< 记录线性表的当前长度 */
} LinearList;

/**
 * @brief 删除线性表中所有值介于 x 和 y 之间的元素
 *
 * @param list 指向 LinearList 结构的指针
 * @param x 范围的下限值
 * @param y 范围的上限值
 */
void deleteInRange(LinearList *list, int x, int y) {
    int insertPos = 0; // 插入位置的指针

    for (int i = 0; i < list->length; i++) {
        if (list->data[i] < x || list->data[i] > y) {
            if (i != insertPos) {
                list->data[insertPos] = list->data[i];
            }
            insertPos++;
        }
    }

    list->length = insertPos; // 更新线性表的长度
}

4.完整代码

/**
 * @file linear_list.c
 * @brief 实现了线性表的基本操作,如初始化、插入、删除、输出和删除范围内的元素。
 */

#include <stdio.h>
#include <stdlib.h>

#define MAX_SIZE 100 /**< 定义线性表的最大长度为100 */

typedef struct {
    int data[MAX_SIZE]; /**< 用数组存储线性表的元素 */
    int length; /**< 记录线性表的当前长度 */
} LinearList;

/**
 * @brief 删除线性表中所有值介于 x 和 y 之间的元素
 *
 * @param list 指向 LinearList 结构的指针
 * @param x 范围的下限值
 * @param y 范围的上限值
 */
void deleteInRange(LinearList *list, int x, int y) {
    int insertPos = 0; // 插入位置的指针

    for (int i = 0; i < list->length; i++) {
        if (list->data[i] < x || list->data[i] > y) {
            if (i != insertPos) {
                list->data[insertPos] = list->data[i];
            }
            insertPos++;
        }
    }

    list->length = insertPos; // 更新线性表的长度
}

/**
 * @brief 初始化线性表
 *
 * @param list 指向 LinearList 结构的指针
 */
void initList(LinearList *list) {
    list->length = 0;
}

/**
 * @brief 插入元素到线性表指定位置
 *
 * @param list 指向 LinearList 结构的指针
 * @param element 要插入的元素值
 * @param position 插入的位置
 * @return int 插入成功返回1,失败返回0
 */
int insertElement(LinearList *list, int element, int position) {
    if (position < 0 || position > list->length || list->length == MAX_SIZE) {
        return 0; // 插入失败
    }

    // 将插入位置之后的元素依次向后移动一位
    for (int i = list->length - 1; i >= position; i--) {
        list->data[i + 1] = list->data[i];
    }

    list->data[position] = element;
    list->length++; // 长度加一
    return 1; // 插入成功
}

/**
 * @brief 删除线性表指定位置的元素
 *
 * @param list 指向 LinearList 结构的指针
 * @param position 要删除的元素位置
 * @return int 删除成功返回1,失败返回0
 */
int deleteElement(LinearList *list, int position) {
    if (position < 0 || position >= list->length) {
        return 0; // 删除失败
    }

    // 将删除位置之后的元素依次向前移动一位
    for (int i = position; i < list->length - 1; i++) {
        list->data[i] = list->data[i + 1];
    }

    list->length--; // 长度减一
    return 1; // 删除成功
}

/**
 * @brief 输出线性表中的元素
 *
 * @param list LinearList 结构
 */
void displayList(LinearList list) {
    printf("Linear List: ");
    for (int i = 0; i < list.length; i++) {
        printf("%d ", list.data[i]);
    }
    printf("\n");
}

/**
 * @brief 销毁线性表
 *
 * @param list 指向 LinearList 结构的指针
 */
void destroyList(LinearList *list) {
    list->length = 0;
    // 可选的:将数组元素清零
    // memset(list->data, 0, sizeof(list->data));
}


/**
 * @brief 主函数
 *
 * @return int 程序执行结果
 */
int main() {
    LinearList list;
    initList(&list);

    int elements[] = {21, 22, 5, 6, 23, 7, 24, 8, 25, 9, 10, 26, 27, 28};
    int numElements = sizeof(elements) / sizeof(elements[0]);

    for (int i = 0; i < numElements; i++) {
        insertElement(&list, elements[i], i);
    }

    displayList(list);

    int x = 6;
    int y = 25;
    deleteInRange(&list, x, y);
    displayList(list);

    destroyList(&list);

    return 0;
}

5.运行结果

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/174620.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Redis(事务和持久化)(很重要!)

事务的定义&#xff1a; Redis中的事务是指一组命令的集合&#xff0c;这些命令可以在一个原子操作中执行。在Redis中&#xff0c;可以使用MULTI命令开始一个事务&#xff0c;然后使用EXEC命令来执行事务中的所有命令&#xff0c;或者使用DISCARD命令来取消事务。事务可以确保…

Python+Qt虹膜检测识别

程序示例精选 PythonQt虹膜检测识别 如需安装运行环境或远程调试&#xff0c;见文章底部个人QQ名片&#xff0c;由专业技术人员远程协助&#xff01; 前言 这篇博客针对《PythonQt虹膜检测识别》编写代码&#xff0c;代码整洁&#xff0c;规则&#xff0c;易读。 学习与应用推…

从0开始学习JavaScript--JavaScript类型化数组进阶

前面的文章&#xff0c;已经介绍了JavaScript类型化数组的基本概念、常见类型和基本操作。在本文中&#xff0c;我们将深入探讨类型化数组的一些进阶特性&#xff0c;包括共享内存、大端小端字节序、以及类型化数组与普通数组之间的转换&#xff0c;通过更丰富的示例代码&#…

读像火箭科学家一样思考笔记05_思想实验

1. 思想实验室 1.1. 思想实验至少可以追溯到古希腊时期 1.1.1. 从那时起&#xff0c;它们就跨越各个学科&#xff0c;在哲学、物理学、生物学、经济学等领域取得重大突破 1.1.2. 它们为火箭提供动力&#xff0c;推翻政府&#xff0c;发展进化生物学&#xff0c;解开宇宙的奥…

算法的奥秘:常见的六种算法(算法导论笔记2)

算法的奥秘&#xff1a;种类、特性及应用详解&#xff08;算法导论笔记1&#xff09; 上期总结算法的种类和大致介绍&#xff0c;这一期主要讲常见的六种算法详解以及演示。 排序算法&#xff1a; 排序算法是一类用于对一组数据元素进行排序的算法。根据不同的排序方式和时间复…

弄懂Rust编程中的Trait

1.定义 trait trait 定义了某个特定类型拥有可能与其他类型共享的功能。可以通过 trait 以一种抽象的方式定义共享的行为。可以使用 trait bounds 指定泛型是任何拥有特定行为的类型。 一个类型的行为由其可供调用的方法构成。如果可以对不同类型调用相同的方法的话&#xff…

web:[GXYCTF2019]禁止套娃

题目 打开页面显示为 没有其他信息&#xff0c;查看源代码也是空的 用dirsearch扫一下 可能是git源码泄露&#xff0c;可以用githack获取源码 python Githack.py http://5063c85b-a33d-4b6f-ae67-262231a4582e.node4.buuoj.cn:81/.git/去工具所在的目录找到index.php文件 打开…

USART的标准库编程

使用USART与计算机通信 电脑上只有usb端口 没有TX 和RX需要一个USB转TTL电平模块来实现通信 芯片C8T6中只有三个UASRT 选其中一个UASRT来通信即可 那么如何定位那个USART的TX 和RX引脚呢&#xff1f; 方式1 查找最小系统板引脚分布图 查找USART1的引脚 RTS CTS是硬件流控 CK…

5 个适用于 Linux 的开源日志监控和管理工具

当Linux等操作系统运行时&#xff0c;会发生许多事件和在后台运行的进程&#xff0c;以实现系统资源的高效可靠的使用。这些事件可能发生在系统软件中&#xff0c;例如 init 或 systemd 进程或用户应用程序&#xff0c;例如 Apache、MySQL、FTP 等。 为了了解系统和不同应用程序…

【Python数据结构与算法】--- 递归算法应用-五行代码速解汉诺塔问题.

&#x1f308;个人主页: Aileen_0v0 &#x1f525;系列专栏:PYTHON数据结构与算法学习系列专栏&#x1f4ab;"没有罗马,那就自己创造罗马~" 汉诺塔 两层汉诺塔的演示 三层汉诺塔的走法演示 我不知道有没有朋友跟我一样有一个疑问,如果我们顶端的先放到中间柱子呢?…

从零开始学习typescript——数据类型

数据类型 以前我们用js编写代码的时候&#xff0c;都是直接使用let、var、const 来定义数据类型&#xff1b;js会在运行时来确定数据类型&#xff0c;但是在ts中&#xff0c;可以在声明时就可以指定数据类型。如果你学过其他编程语言&#xff0c;比如c、java就能更好的理解了。…

上门维修安装派单系统小程序APP开发之会员级别设计深度解析

啄木鸟鲁班大师上门安装维修平台APP开发之VIP会员解析&#xff0c;在APP或者小程序里设置的会员叫VIP级别会员&#xff0c;系统一共分为4种会员&#xff0c;注册会员&#xff0c;正式会员&#xff0c;VIP金卡会员&#xff0c;VIP钻卡会员。注册用户是指注册了平台但是没有消费记…

安防视频监控管理平台EasyCVR定制首页开发与实现

视频监控平台EasyCVR能在复杂的网络环境中&#xff0c;将分散的各类视频资源进行统一汇聚、整合、集中管理&#xff0c;在视频监控播放上&#xff0c;TSINGSEE青犀视频安防监控汇聚平台可支持1、4、9、16个画面窗口播放&#xff0c;可同时播放多路视频流&#xff0c;也能支持视…

0时区格林威治时间转换手机当地时间-Android

假设传入的是2023-11-01T12:59:10.420987这样的格式 要将格式为2023-11-01T12:59:10.420987的UTC时间字符串转换为Android设备本地时间&#xff0c;您可以使用java.time包中的类&#xff08;在API 26及以上版本中可用&#xff09;。如果您的应用需要支持较低版本的Android&…

基于ubuntu20.04安装ros系统搭配使用工业相机

基于ubuntu20.04安装ros系统搭配使用工业相机 1. ROS系统安装部署1.1更新镜像源1.1.1 备份源文件1.1.2 更新阿里源1.1.3 更新软件源 1.2 ros系统安装1.2.1 添加ros软件源1.2.2 添加秘钥1.2.3 更新软件源1.2.4 配置及更换最佳软件源1.2.5 ROS安装1.2.6 初始化rosdep1.2.7 设置环…

如何使用无代码系统搭建软件平台?有哪些开源无代码开发平台?

无代码是什么 无代码开发&#xff0c;也称为零代码&#xff08;Zero Code&#xff09;开发&#xff0c;是一种技术概念。无代码开发无需代码基础&#xff0c;适合业务人员、IT开发及其他各类人员使用。他们通过无代码开发平台快速构建应用&#xff0c;并适应各种需求变化&#…

吴恩达《机器学习》9-4-9-6:实现注意:展开参数、梯度检验、随机初始化

一、实现注意:展开参数 在上一个视频中&#xff0c;讨论了使用反向传播算法计算代价函数的导数。在本视频中&#xff0c;将简要介绍一个实现细节&#xff0c;即如何将参数从矩阵展开为向量。这样做是为了在高级最优化步骤中更方便地使用这些参数。 二、梯度检验 在神经网络中…

MySQL MHA高可用配置及故障切换

一、MHA相关概念 1&#xff0e;什么是 MHA MHA&#xff08;MasterHigh Availability&#xff09;是一套优秀的MySQL高可用环境下故障切换和主从复制的软件。 MHA 的出现就是解决MySQL 单点的问题。 MySQL故障切换过程中&#xff0c;MHA能做到0-30秒内自动完成故障切换操作。 …

pytorch中.to(device) 和.cuda()的区别

在PyTorch中&#xff0c;使用GPU加速可以显著提高模型的训练速度。在将数据传递给GPU之前&#xff0c;需要将其转换为GPU可用的格式。 函数原型如下&#xff1a; def cuda(self: T, device: Optional[Union[int, device]] None) -> T:return self._apply(lambda t: t.cuda…

【C++进阶之路】第八篇:智能指针

文章目录 一、为什么需要智能指针&#xff1f;二、内存泄漏1.什么是内存泄漏&#xff0c;内存泄漏的危害2.内存泄漏分类&#xff08;了解&#xff09;3.如何检测内存泄漏&#xff08;了解&#xff09;4.如何避免内存泄漏 三、智能指针的使用及原理1.RAII2.智能指针的原理3.std:…