【山大9009算法题】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.完整代码

#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));
}


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

image-20231121213607285

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

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

相关文章

【Mac】VMware Fusion Pro 安装 CentOS 7

1、下载镜像 CentOS 官网阿里云镜像网易镜像搜狐镜像 Mac M1芯片无法直接使用上述地址下载的最新镜像&#xff08;7.9、9&#xff09;&#xff0c;会一直卡在安装界面&#xff08;在 install 界面按 enter 回车无效&#xff09;&#xff0c;想要使用需要经过一系列操作&#…

机器学习周志华学习笔记-第5章<神经网络>

机器学习周志华学习笔记-第5章<神经网络> 卷王&#xff0c;请看目录 5模型的评估与选择5.1 神经元模型5.2 感知机与多层网络5.3 BP(误逆差)神经网络算法 5.4常见的神经网络5.4.1 RBF网络&#xff08;Radial Basis Function Network&#xff0c;径向基函数网络&#xff0…

MT8768/MTK8768安卓核心板性能参数_联发科安卓智能模块开发方案

MT8768安卓核心板 是一款采用台积电12nm FinFET制程工艺的智能手机芯片。MT8768核心板不仅提供所有高级功能和出色体验&#xff0c;同时确保智能终端具备长电池寿命。该芯片提供了一个1600x720高清(20:9比例)分辨率显示屏&#xff0c;排除了清晰度和功耗之间的平衡问题。该芯片…

Linux之SELinux与防火墙

一、SELinux的说明 开发背景与目的&#xff1a; SELinux由美国国家安全局&#xff08;NSA&#xff09;开发&#xff0c;旨在避免资源的误用。传统的Linux基于自主访问控制&#xff08;DAC&#xff09;&#xff0c;通过判断进程所有者/用户组与文件权限来控制访问&#xff0c;对…

Linux初识进程信号

预备 1&#xff0c;你怎么能认识信号呢&#xff1f; 信号是内置的&#xff0c;进程认识信号&#xff0c;是程序员内置的属性 2&#xff0c;信号产生之后&#xff0c;怎么处理信号&#xff1f; 知道&#xff01;因为在信号产生之前&#xff0c;就已经把处理信号的内容准备好…

如何安全删除 Linux 用户帐户和主目录 ?

Linux 以其健壮性和灵活性而闻名&#xff0c;是全球服务器和桌面的首选。管理用户帐户是系统管理的一个基本方面&#xff0c;包括创建、修改和删除用户帐户及其相关数据。本指南全面概述了如何在 Linux 中安全地删除用户帐户及其主目录&#xff0c;以确保系统的安全性和完整性。…

ubuntu16.04在ros使用USB摄像头-解决could not open /dev/video0问题

首先检查摄像头 lsusb 安装 uvc camera 功能包 sudo apt-get install ros-indigo-uvc-camera 安装 image 相关功能包 sudo apt-get install ros-kinetic-image-* sudo apt-get install ros-kinetic-rqt-image-view运行 uvc_camera 节点 首先输入roscore 然后另外开一个终端输入…

计算机网络socket编程(6)_TCP实网络编程现 Command_server

个人主页&#xff1a;C忠实粉丝 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 C忠实粉丝 原创 计算机网络socket编程(6)_TCP实网络编程现 Command_server 收录于专栏【计算机网络】 本专栏旨在分享学习计算机网络的一点学习笔记&#xff0c;欢迎大家在评论…

聚水潭与MySQL数据集成案例分享

聚水潭数据集成到MySQL的技术案例分享 在现代数据驱动的业务环境中&#xff0c;如何高效、可靠地实现不同系统之间的数据对接成为企业关注的焦点。本次案例将详细介绍如何通过轻易云数据集成平台&#xff0c;将聚水潭的数据无缝集成到MySQL数据库中&#xff0c;实现从“聚水谭…

Kafka日志索引详解以及生产常见问题分析与总结

文章目录 一、Kafka的Log日志梳理1.1、Topic下的消息如何存储1.1.1、log文件追加记录所有消息1.1.2、index和timeindex加速读取log消息日志 1.2、文件清理机制1.2.1、如何判断哪些日志文件过期了1.2.2、过期的日志文件如何处理 1.3、Kafka的文件高效读写机制1.3.1、Kafka的文件…

数据结构 (5)栈

一、基本概念 栈是一种运算受限的线性表&#xff0c;它只允许在表的一端进行插入和删除操作&#xff0c;这一端被称为栈顶&#xff08;Top&#xff09;&#xff0c;而另一端则被称为栈底&#xff08;Bottom&#xff09;。栈的插入操作被称为入栈&#xff08;Push&#xff09;&a…

AI 在软件开发流程中的优势、挑战及应对策略

AI 在软件开发流程中的优势、挑战及应对策略 随着人工智能技术的飞速发展&#xff0c;AI大模型正在逐步渗透到软件开发的各个环节&#xff0c;从代码自动生成到智能测试&#xff0c;AI的应用正在重塑传统的软件开发流程。本篇文章将分析AI在软件开发流程中带来的优势&#xff0…

2025-2026财年美国CISA国际战略规划(下)

文章目录 前言四、加强综合网络防御&#xff08;一&#xff09;与合作伙伴共同实施网络防御&#xff0c;降低集体风险推动措施有效性衡量 &#xff08;二&#xff09;大规模推动标准和安全&#xff0c;以提高网络安全推动措施有效性衡量 &#xff08;三&#xff09;提高主要合作…

hubuctf-2024校赛-复现wp

web easyweb1 <?php error_reporting(0); highlight_file(__FILE__);$flag getenv("GZCTF_FLAG");if(isset($_GET[num])){$num $_GET[num];if(preg_match("/[0-9]/", $num)){die("You are failed.");}if(intval($num)){echo $flag;} } 利…

[AutoSar]BSW_Diagnostic_007 BootLoader 跳转及APP OR boot response 实现

目录 关键词平台说明背景一、Process Jump to Bootloader二、相关函数和配置2.1 Dcm_GetProgConditions()2.2 Dcm_SetProgConditions() 三、如何实现在APP 还是BOOT 中对10 02服务响应3.1 配置3.2 code 四、报文五、小结 关键词 嵌入式、C语言、autosar、OS、BSW、UDS、diagno…

Linux命令思维导图

看到一个很不错的Linux命令思维导图&#xff0c;用机器翻译了一下&#xff0c;建议收藏备用。 附上英文版&#xff1a;

vmware esxi vcenter6.7安装教程(dell)以及许可证

背景 vSphere是数据中心产品附带的软件套件&#xff0c;vSphere就像是Microsoft Office套件一样&#xff0c;其中包含许多软件&#xff0c;例如PPT、Word、Excle等&#xff0c;同理&#xff0c;vSphere也是一个软件套装&#xff0c;其中包含vCenter、ESXi、vSphere Client等&a…

springboot实战(17)(“大事件“——新增文章主体逻辑)

目录 一、新增文章涉及的数据表、实体类。 &#xff08;1&#xff09;表结构。 &#xff08;2&#xff09;实体类&#xff08;Article&#xff09; 二、接口文档分析。 &#xff08;1&#xff09;请求方式与请求路径。 &#xff08;2&#xff09;请求参数。 &#xff08;3&…

Vue小项目(开发一个购物车)

基于Vue知识点1&#xff08;点击跳转&#xff09;、Vue知识点2&#xff08;点击跳转&#xff09; ​想要学习更多前端知识&#xff1a;点击Web前端专栏 接下来我们开发一个如下图所示&#xff0c;有最基本购物车功能的简易小项目 下面这是最基本的HTMLCSS框架&#xff01;&…

Vue.js 学习总结(16)—— 为什么 :deep、/deep/、>>> 样式能穿透到子组件

不使用 deep 要想修改三方组件样式&#xff0c;只能添加到 scoped 之外&#xff0c;弊端是污染了全局样式&#xff0c;后续可能出现样式冲突。 <style lang"less"> .container {.el-button {background: #777; } }使用 /deep/ deprecated .container1 {/deep…