当前位置: 首页 > news >正文

C语言学习笔记20260630-动态整数序列维护(顺序表综合应用)

C语言学习笔记20260630-动态整数序列维护(顺序表综合应用)

一、学习目标

通过“动态整数序列维护”问题,全面掌握顺序表(数组)在增、删、查、改、排序及遍历等核心操作上的综合应用。深入理解数组作为线性表在内存中的连续存储特性,学习如何通过维护len变量来动态管理逻辑长度,并掌握顺序表插入操作中的元素后移技巧以及自定义排序算法的实现。

二、问题拆解与核心逻辑

本题要求维护一个初始为空的整数序列,支持多达 8 种操作。核心约束条件为:

  1. 顺序表模拟:使用静态数组arr[MAXN]模拟动态序列,通过变量len记录当前序列的实际元素个数。
  2. 边界与移动:在指定位置插入元素时,必须保证后续元素整体后移,防止数据覆盖;在删除或插入时,需严格维护len的准确性。
  3. 综合调度:通过while(q--)循环配合if-else分支,根据操作码(op)动态调度对应的功能函数。

三、核心功能模块解析与完整代码

3.1 排序模块:冒泡排序的升序与降序实现

排序是顺序表的高级操作。这里采用经典的双层循环冒泡排序,通过改变比较条件(><)来实现升序或降序。

完整代码实现:

#define_CRT_SECURE_NO_WARNINGS#include<stdio.h>#defineMAXN10000// 升序排序,数组+长度作为参数传入voidsortAsc(intarr[],intlen){for(inti=0;i<len-1;i++){for(intj=0;j<len-1-i;j++){if(arr[j]>arr[j+1]){intt=arr[j];arr[j]=arr[j+1];arr[j+1]=t;}}}}// 降序排序voidsortDesc(intarr[],intlen){for(inti=0;i<len-1;i++){for(intj=0;j<len-1-i;j++){if(arr[j]<arr[j+1]){intt=arr[j];arr[j]=arr[j+1];arr[j+1]=t;}}}}

3.2 核心交互模块:主函数与操作调度

主函数负责读取操作指令,并执行对应的数组操作。其中,**在指定位置插入元素(操作4)**是本题的难点,需要逆序移动元素以腾出空间。

完整代码实现:

intmain(){intarr[MAXN];intlen=0;// 维护当前序列的逻辑长度intq;scanf("%d",&q);while(q--){intop;scanf("%d",&op);if(op==1){// 末尾添加x:直接赋值到 arr[len],然后长度+1intx;scanf("%d",&x);arr[len++]=x;}elseif(op==2){// 删除末尾:逻辑长度-1即可(物理内存无需清空)len--;}elseif(op==3){// 输出下标i:利用数组O(1)随机访问特性inti;scanf("%d",&i);printf("%d\n",arr[i]);}elseif(op==4){// 在下标i与i+1之间插入x:即插入到下标 i+1 的位置inti,x;scanf("%d%d",&i,&x);// 元素后移:从最后一个元素开始,依次向后挪一位for(intj=len;j>i+1;j--){arr[j]=arr[j-1];}arr[i+1]=x;// 填入新元素len++;// 长度+1}elseif(op==5){sortAsc(arr,len);}elseif(op==6){sortDesc(arr,len);}elseif(op==7){printf("%d\n",len);}elseif(op==8){// 遍历输出整个序列for(intj=0;j<len;j++){if(j>0)printf(" ");printf("%d",arr[j]);}printf("\n");}}return0;}

四、核心细节与易错点解析

4.1 插入操作的元素后移(操作4)

在顺序表的任意位置插入元素时,必须从后往前移动元素。代码中的for (int j = len; j > i + 1; j--)确保了arr[len-1]先移动到arr[len],以此类推,最终将arr[i+1]的位置空出来。如果从前往后移动,会导致后续数据被覆盖。

4.2 逻辑长度len的维护

数组的物理大小是固定的(MAXN),但序列的逻辑大小由len决定。

  • 添加arr[len++] = x;先使用当前len作为下标,再自增。
  • 删除末尾len--;仅仅缩减逻辑边界,原arr[len]处的数据依然存在于内存中,但后续操作不再访问它。

4.3 输出格式的控制(操作8)

在输出整个序列时,要求元素之间用空格隔开,且最后一个元素后没有多余空格。代码通过if (j > 0) printf(" ");巧妙实现了这一格式控制,避免了复杂的边界判断。

五、总结与工程实践建议

本题是一个典型的顺序表(动态数组)综合应用题。它涵盖了数据结构中线性表最基础的增删查改与排序。在实际工程或更复杂的算法场景中,如果数据量极大且频繁在中间位置插入/删除,静态数组的 O(N) 移动开销会变得难以接受,此时可以考虑使用链表或 C++ STL 中的std::vector(动态数组)。但在数据规模适中(如本题 q ≤ 7000)且对随机访问有较高要求的场景下,基于数组的顺序表依然是最高效、最简洁的解决方案。

http://www.jsqmd.com/news/1098290/

相关文章:

  • 工业LED驱动模块电源技术选型参考:钡特 NCD24-1000 与 KC24H-1000R3 硬件设计适配解析丨-1200丨-700丨国产化丨DC-DC
  • YOLOv8推理优化实战:从1.2FPS到35FPS的全链路性能提升指南
  • 2026Word文档压缩大小完整实操指南:压缩图片、另存为瘦身全流程讲解
  • SRC漏洞挖掘实战指南:从零入门到精通,掌握合法渗透测试核心技能
  • VisualGGPK2终极指南:5步掌握流放之路资源管理与游戏MOD开发
  • 抖音内容批量下载工具:从数据焦虑到内容自由的智能解决方案
  • AI模型测试实战指南:从原理到部署的测试工程师视角
  • Web第七次课后作业
  • 从零构建AI应用:Dify工作流与智能体实战指南
  • MediaCrawler:5分钟快速上手多平台数据采集爬虫框架
  • AI 电动香薰蜡烛智能功率 MOSFET 精准选型方案
  • Doris集群Docker部署实战:解决FE/BE节点注册与网络配置难题
  • Godot游戏资源逆向解析终极指南:深入探索PCK文件解包技术
  • C#集成YOLOv8目标检测:基于ONNX Runtime的工业视觉应用实践
  • Three.js 场景雾化教程
  • Vue巨树组件完整解决方案:突破海量数据渲染瓶颈的终极指南
  • 2026年Word文档压缩大小完整操作指南:另存为与图片压缩实操步骤
  • 【毕业设计】SpringBoot+Vue+MySQL 雪具销售系统平台源码+数据库+论文+部署文档
  • DAY3 编码器接口
  • 企业级旅游出行指南_ms ()abo管理系统源码|SpringBoot+Vue+MyBatis架构+MySQL数据库【完整版】
  • Java SpringBoot+Vue3+MyBatis 影城会员管理系统系统源码|前后端分离+MySQL数据库
  • 告别手动重写!用GoGoCode插件一键把Vue2+ElementUI项目升级到Vue3+ElementPlus
  • 为什么Parsedown是PHP开发者必备的Markdown解析利器?终极指南揭秘
  • 如何快速为Android Studio安装中文语言包:完整界面汉化指南
  • 【毕业设计】SpringBoot+Vue+MySQL 公益服务平台平台源码+数据库+论文+部署文档
  • 影城会员管理系统信息管理系统源码-SpringBoot后端+Vue前端+MySQL【可直接运行】
  • 5步实现高效矿石定位:Advanced XRay模组深度解析与实战指南
  • 2026福建黄金回收白银回收铂金回收旧料回收怎么选?五家高实价铂金白银线下门店测评清单 + 联系方式
  • Windows系统文件AppVPolicy.dll丢失找不到问题解决
  • 终极窗口置顶神器:3分钟告别多窗口遮挡烦恼