909-2015-T1

news2024/9/20 22:41:30

文章目录

  • 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.运行结果

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【正点原子STM32连载】第五十六章 DSP BasicMath实验 摘自【正点原子】APM32F407最小系统板使用指南

1&#xff09;实验平台&#xff1a;正点原子stm32f103战舰开发板V4 2&#xff09;平台购买地址&#xff1a;https://detail.tmall.com/item.htm?id609294757420 3&#xff09;全套实验源码手册视频下载地址&#xff1a; http://www.openedv.com/thread-340252-1-1.html## 第五…

2023 年戴森设计大奖得主是谁?给大楼降温、争取救援机会

2023 年戴森设计大奖得主是谁&#xff1f;给大楼降温、争取救援机会 ​编辑拉风的极客2023/11/22 摘要 当今社会除了持续不断对科技创新保持注目&#xff0c;还有很多年轻发明家为了实际场景的难题提供解决方案。 11 月 15 日&#xff0c;2023 年戴森设计大奖国际大奖名单正…

在 Redis 中使用 JSON 文档:命令行界面(CLI)和 Navicat 集成

Redis&#xff0c;因其极高的性能而闻名&#xff0c;是一款多功能的 NoSQL 数据库&#xff0c;擅长处理键值对。虽然 Redis主要用于处理简单数据结构&#xff0c;但是同样支持更多复杂的数据类型&#xff0c;如列表、集合甚至是 JSON 文件。在本文&#xff0c;我们将深入到 Red…

聚类系列(一)——什么是聚类?

目前在做聚类方面的科研工作, 看了很多相关的论文, 也做了一些工作, 于是想出个聚类系列记录一下, 主要包括聚类的概念和相关定义、现有常用聚类算法、聚类相似性度量指标、聚类评价指标、 聚类的应用场景以及共享一些聚类的开源代码 下面正式进入该系列的第一个部分&#xff…

MySQL数据库入门到大牛_基础_12_MySQL数据类型精讲

文章目录 1. MySQL中的数据类型2. 整数类型2.1 类型介绍2.2 可选属性2.2.1 M2.2.2 UNSIGNED2.2.3 ZEROFILL 2.3 适用场景2.4 如何选择&#xff1f; 3. 浮点类型3.1 类型介绍3.2 数据精度说明3.3 精度误差说明 4. 定点数类型4.1 类型介绍4.2 开发中经验 5. 位类型&#xff1a;BI…

visionOS空间计算实战开发教程Day 5 纹理和材质

在​​Day 4​​​中我们使用了​​ImmersiveSpace​​并在其中添加了一个立方体&#xff0c;但对这个立方体我们只配置了长宽高&#xff0c;并没有做进一步的操作。 本文中我们会通过纹理和材质对这个立方体的六个面分别进行不同的绘制。首先我们将​​ImmersiveView​​分拆…

拒绝“信息茧房”,不做“井底之蛙”

前言 在信息爆炸的时代&#xff0c;我们每天都会被各种各样的信息包围着。这些信息来自各种渠道&#xff0c;如社交媒体、新闻媒体、搜索引擎、推荐系统等等。在算法和选择下&#xff0c;社交平台、购物平台帮大家过滤掉不熟悉、不喜欢、不感兴趣的内容&#xff0c;只推荐想看…

文件的原理和应用

常识: 1 文件包括属性和内容 2 文件有打开和未打开文件&#xff0c; 3 本文先讨论谁打开的文件&#xff0c;以及如何管理已经打开的文件 一 回忆c接口 1 fopen 我们在test.c里面用一下fopen函数&#xff0c;不存在打开的文件会默认创建&#xff0c;那为什么默认新建在当前…

RabbitMQ 的网页界面操作说明

启动 上面给用户添加了角色和权限&#xff0c; 我们就可以登录了 先手动创建两个队列&#xff0c;然后再把这两个队列和交换机绑定&#xff0c;就可以发布消息 回到队列中看看有什么变化 队列中显示绑定了交换机 再看一下队列中发生的变化 可以看到队列中收到了信息

代码随想录二刷 | 链表 |环形链表II

代码随想录二刷 &#xff5c; 链表 &#xff5c;环形链表II 题目描述解题思路 & 代码实现判断链表是否有环如何找到环的入口 题目描述 142.环形链表II 给定一个链表的头节点 head &#xff0c;返回链表开始入环的第一个节点。 如果链表无环&#xff0c;则返回 null。 如…

千梦网创:创业一定要学会打造自己的榜样圈

一、状态 最近一直在学习刘克亚老师的书籍和课程。 克亚老师“国际自由族”的概念实际上就是实现“工作自由”。 财务自由只是一个奋斗目标&#xff0c;但“工作自由”是一种可实现的工作状态。 这种工作状态有一个特征就是全力打造一套能够无限趋近于“全自动”的赚钱系统。…

超详细 | 实验室linux服务器非root账号 | 安装pip | 安装conda

登录实验室公用服务器&#xff0c;个人账号下&#xff08;非root&#xff09;是空的&#xff0c;啥也没有&#xff0c;想安装下pip和conda。 转了一圈&#xff0c;好像没太有针对这个需求写具体博客的&#xff0c;但有挺多讲直接在root下安的&#xff08;用的应该是个人虚拟机&…

代码随想录二刷 | 链表 |链表相交

代码随想录二刷 &#xff5c; 链表 &#xff5c;链表相交 题目描述解题思路 & 代码实现 题目描述 160.链表相交 给你两个单链表的头节点 headA 和 headB &#xff0c;请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点&#xff0c;返回 null 。 题目数据 保…

透视未来:现代发电厂地区可视化与智慧能源的结合

随着全球能源消费的不断增长&#xff0c;电力需求也在不断上升。作为能源行业的重要组成部分&#xff0c;现代发电厂扮演着不可替代的角色。而现代发电厂的数据管理和监控系统&#xff0c;则是确保其安全、高效、稳定运行的重要手段。在这个背景下&#xff0c;现代发电厂地区可…

Python+Selenium安装及环境配置手把手教会你

前言 Selenium是一个用于web自动化测试的框架&#xff0c;在使用Ajax请求数据的页面中&#xff0c;会出现 sign ,token等密钥&#xff0c;如果考虑去破解可能花费的精力较多&#xff0c;所以考虑借助使用Selenium框架来实现数据爬取。 Selenium 简介 1. 1&#xff0c;组件✨ …

SMBGhost_RCE漏洞(CVE-2020-0796永恒之黑)

https://blog.csdn.net/qq_45372008/article/details/106980409 https://zhuanlan.zhihu.com/p/374949632 SMB 3.1.1协议处理某些请求的方式中存在远程执行代码漏洞&#xff0c;可能被攻击者利用远程执行任意代码。该漏洞的后果十分接近永恒之蓝系列&#xff0c;都利用Windows …

不看后悔系列 | 秒做BI报表,告别低效分析

根据经验来看&#xff0c;做企业数据分析&#xff0c;通常是由业务提出需求&#xff0c;交给IT去取数开发&#xff0c;当业务通过分析报表有了新的需求时&#xff0c;仍需交给IT去取数分析&#xff0c;这就导致业务的分析效率低。进入大数据时代&#xff0c;这样的低效数据分析…

【linux】安装telnet

Telnet Telnet协议是TCP/IP协议族中的一员&#xff0c;是Internet远程登录服务的标准协议和主要方式。它为用户提供了在本地计算机上完成远程主机工作的能力。在终端使用者的电脑上使用telnet程序&#xff0c;用它连接到服务器。终端使用者可以在telnet程序中输入命令&#xf…

python练习题(markdown中的60道题)

1.Demo01 摄氏温度转化为华氏温度 celsius float(input(输入摄氏温度&#xff1a;)) fahrenheit (9/5)*celsius 32 print(%0.1f 摄氏温度转为华氏温度为 %0.1f % (celsius, fahrenheit))结果&#xff1a; 2.Demo02 计算圆柱体的体积 h, r map(float, input().split())# …