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

C语言学习笔记20260630-动态整数序列维护(顺序表综合应用)
C语言学习笔记20260630-动态整数序列维护顺序表综合应用一、学习目标通过“动态整数序列维护”问题全面掌握顺序表数组在增、删、查、改、排序及遍历等核心操作上的综合应用。深入理解数组作为线性表在内存中的连续存储特性学习如何通过维护len变量来动态管理逻辑长度并掌握顺序表插入操作中的元素后移技巧以及自定义排序算法的实现。二、问题拆解与核心逻辑本题要求维护一个初始为空的整数序列支持多达 8 种操作。核心约束条件为顺序表模拟使用静态数组arr[MAXN]模拟动态序列通过变量len记录当前序列的实际元素个数。边界与移动在指定位置插入元素时必须保证后续元素整体后移防止数据覆盖在删除或插入时需严格维护len的准确性。综合调度通过while(q--)循环配合if-else分支根据操作码op动态调度对应的功能函数。三、核心功能模块解析与完整代码3.1 排序模块冒泡排序的升序与降序实现排序是顺序表的高级操作。这里采用经典的双层循环冒泡排序通过改变比较条件或来实现升序或降序。完整代码实现#define_CRT_SECURE_NO_WARNINGS#includestdio.h#defineMAXN10000// 升序排序数组长度作为参数传入voidsortAsc(intarr[],intlen){for(inti0;ilen-1;i){for(intj0;jlen-1-i;j){if(arr[j]arr[j1]){inttarr[j];arr[j]arr[j1];arr[j1]t;}}}}// 降序排序voidsortDesc(intarr[],intlen){for(inti0;ilen-1;i){for(intj0;jlen-1-i;j){if(arr[j]arr[j1]){inttarr[j];arr[j]arr[j1];arr[j1]t;}}}}3.2 核心交互模块主函数与操作调度主函数负责读取操作指令并执行对应的数组操作。其中**在指定位置插入元素操作4**是本题的难点需要逆序移动元素以腾出空间。完整代码实现intmain(){intarr[MAXN];intlen0;// 维护当前序列的逻辑长度intq;scanf(%d,q);while(q--){intop;scanf(%d,op);if(op1){// 末尾添加x直接赋值到 arr[len]然后长度1intx;scanf(%d,x);arr[len]x;}elseif(op2){// 删除末尾逻辑长度-1即可物理内存无需清空len--;}elseif(op3){// 输出下标i利用数组O(1)随机访问特性inti;scanf(%d,i);printf(%d\n,arr[i]);}elseif(op4){// 在下标i与i1之间插入x即插入到下标 i1 的位置inti,x;scanf(%d%d,i,x);// 元素后移从最后一个元素开始依次向后挪一位for(intjlen;ji1;j--){arr[j]arr[j-1];}arr[i1]x;// 填入新元素len;// 长度1}elseif(op5){sortAsc(arr,len);}elseif(op6){sortDesc(arr,len);}elseif(op7){printf(%d\n,len);}elseif(op8){// 遍历输出整个序列for(intj0;jlen;j){if(j0)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[i1]的位置空出来。如果从前往后移动会导致后续数据被覆盖。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且对随机访问有较高要求的场景下基于数组的顺序表依然是最高效、最简洁的解决方案。