【考研C语言编程题】数组元素批量插入实现(含图示+三部曲拆解)

【考研C语言编程题】数组元素批量插入实现(含图示+三部曲拆解)

一、题目要求

编写C语言程序,实现将数组b的所有元素批量插入到数组a的指定位置(位置从0开始计数)。要求严格遵循“腾出空间→插入元素→更新长度”的操作三部曲,且需满足以下条件:

  1. 数组a采用动态内存分配(支持长度动态扩展);
  2. 需处理插入位置越界、内存分配失败等异常情况;
  3. 禁止使用函数声明,直接通过函数调用实现逻辑,主函数放在代码最后;
  4. 插入后需打印原数组、待插入数组及插入结果,清晰展示过程。

二、插入过程图示模拟

以“原数组a = [1, 3, 5, 7],待插入数组b = [2, 4],插入位置pos = 1”为例,三步曲流程如下:

1. 初始状态

  • 原数组a(长度4):[1] [3] [5] [7]
  • 待插入数组b(长度2):[2] [4]
  • 插入位置pos=1:表示插入到a[1](元素3)之前

2. 第一步:腾出空间(扩容+元素后移)

  • 扩容:原数组长度4 + 待插入长度2 = 新长度6,通过realloc扩展a的内存空间;
  • 元素后移:从a的末尾元素(a[3]=7)开始,将pos=1及之后的元素(3、5、7)向后移动lenB=2位,避免被覆盖。
    后移后a的状态:[1] [ ] [ ] [3] [5] [7](空位置用于存放b的元素)

3. 第二步:插入元素

b的元素依次填入a腾出的空位置(从pos=1开始):
插入后a的状态:[1] [2] [4] [3] [5] [7]

4. 第三步:更新长度

将原数组a的长度从4更新为6,完成插入。

三、完整代码实现

#include <stdio.h>
#include <stdlib.h>  // 包含动态内存操作函数(malloc、realloc、free)// 数组插入核心函数(直接定义,不单独声明)
int* insertArray(int* a, int* lenA, int* b, int lenB, int pos) {// 先做参数合法性校验(避免异常操作)if (pos < 0 || pos > *lenA) {  // 插入位置不能小于0或大于原数组长度printf("错误:插入位置不合法!\n");return NULL;}if (lenB == 0) {  // 待插入数组无元素,无需操作printf("提示:待插入数组为空,无需插入!\n");return a;}// 第一步:腾出空间(扩容+元素后移)int newLen = *lenA + lenB;  // 计算插入后的新长度// 扩容:用realloc扩展数组a的内存,返回新地址(原地址可能失效)int* newA = (int*)realloc(a, newLen * sizeof(int));if (newA == NULL) {  // 内存分配失败(如内存不足)printf("错误:内存分配失败,无法扩容!\n");return NULL;}// 元素后移:从原数组末尾向前遍历,避免覆盖数据for (int i = *lenA - 1; i >= pos; i--) {newA[i + lenB] = newA[i];  // 每个元素后移lenB位}// 第二步:插入元素(将b的元素填入腾出的空间)for (int i = 0; i < lenB; i++) {newA[pos + i] = b[i];  // 从pos位置开始依次插入b的元素}// 第三步:更新长度(将新长度通过指针传出)*lenA = newLen;return newA;  // 返回插入后的新数组地址
}// 打印数组的辅助函数(用于展示数组内容)
void printArray(int* arr, int len, char* name) {printf("%s(长度%d):", name, len);for (int i = 0; i < len; i++) {printf("%d ", arr[i]);}printf("\n");
}// 主函数(放在最后,逻辑更清晰)
int main() {// 1. 初始化原数组a(动态内存分配)int lenA = 4;  // 原数组a的初始长度int* a = (int*)malloc(lenA * sizeof(int));if (a == NULL) {  // 检查内存分配是否成功printf("错误:原数组初始化失败!\n");return 1;}// 给原数组a赋值:[1, 3, 5, 7]a[0] = 1;a[1] = 3;a[2] = 5;a[3] = 7;// 2. 初始化待插入数组b(静态数组,无需动态分配)int b[] = {2, 4};  // 待插入的元素int lenB = sizeof(b) / sizeof(b[0]);  // 计算b的长度(2)int insertPos = 1;  // 插入位置(插入到a[1]之前)// 3. 打印插入前的数组printf("=== 插入前 ===\n");printArray(a, lenA, "原数组a");printArray(b, lenB, "待插入数组b");printf("插入位置:pos = %d\n\n", insertPos);// 4. 调用插入函数,执行插入操作a = insertArray(a, &lenA, b, lenB, insertPos);if (a == NULL) {  // 检查插入是否成功free(a);  // 失败时释放已分配的内存,避免泄漏return 1;}// 5. 打印插入后的结果printf("=== 插入后 ===\n");printArray(a, lenA, "结果数组a");// 6. 释放动态内存(避免内存泄漏,必须执行)free(a);a = NULL;  // 避免野指针return 0;
}

四、代码说明与考点分析

1. 核心逻辑拆解

  • 腾出空间:通过realloc实现动态扩容,解决静态数组长度固定的问题;元素从后向前移动,是避免数据覆盖的关键(若从前往后移动,a[1]会先被覆盖,后续元素无法正确迁移)。
  • 插入元素:通过循环将b的元素依次填入a的空位置,索引关系为newA[pos+i] = b[i]i从0到lenB-1)。
  • 更新长度:通过指针lenA将新长度传出(因为函数参数是值传递,需用指针才能修改外部变量)。

2. 考研高频考点

  • 动态内存管理malloc初始化数组、realloc扩容、free释放内存,需理解“动态内存的生命周期由程序员控制”,避免内存泄漏和野指针。
  • 数组操作边界:插入位置的合法性校验(0 ≤ pos ≤ lenA),是代码健壮性的重要体现,考研编程题常考“异常情况处理”。
  • 函数参数传递:通过指针传递数组长度,实现“函数修改外部变量”,需区分“值传递”和“地址传递”的差异。

五、运行结果

编译运行代码后,输出如下(与图示流程完全一致):

=== 插入前 ===
原数组a(长度4):1 3 5 7 
待插入数组b(长度2):2 4 
插入位置:pos = 1=== 插入后 ===
结果数组a(长度6):1 2 4 3 5 7 

六、扩展思考(考研复试常问)

  1. 若需支持floatchar类型的数组插入,代码需如何修改?(提示:将int替换为对应类型,或使用宏定义实现泛型)
  2. 多次插入时,频繁调用realloc会影响效率,如何优化?(提示:预先分配更大的内存空间,减少扩容次数)
  3. 若要实现“批量删除数组元素”,思路与插入有何异同?(提示:删除需先前移元素,再通过realloc缩小内存,最后更新长度)

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

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

相关文章

监控系统 | 脚本案例

1、监控系统中的cpu、内存、硬盘、、使用率超过80%进行邮件告警&#xff08;可使用邮箱QQ&#xff09;详细步骤说明&#xff1a;1. 脚本初始化#!/bin/bash&#xff1a;指定使用bash shell执行dateMax80&#xff1a;设置资源使用率阈值&#xff08;80%&#xff09;2. 资源监控CP…

Vulkan 学习(20)---- UniformBuffer 的使用

目录UniformBufferDescriptorSetLayout 和 VkBuffer顶点着色器定义描述符布局(DescriptorSetLayout)创建 UniformBuffer描述符池(DescriptorSet Pool)描述符集(DescriptorSet)更新描述符集使用描述符集使用多个 DescriptorUniformBuffer 本篇文档是通过 Uniform Buffer 的使用…

[光学原理与应用-461]:波动光学 - 波片实现偏振态的转换或调整

波片&#xff08;Wave Plate&#xff09;是一种基于双折射效应的光学元件&#xff0c;其核心功能是通过控制光波中寻常光&#xff08;o光&#xff09;和非寻常光&#xff08;e光&#xff09;的相位差&#xff0c;实现偏振态的转换或调整。以下是波片的主要功能及其原理的详细说…

Flutter之riverpod状态管理详解

一、riverpod状态管理中所涉及到的provider对比分析Provider 类型核心用途最佳适用场景优势劣势/注意事项Provider(v1)暴露一个恒定不变的&#xff08;或不需要Riverpod管理的&#xff09;对象或值。依赖注入&#xff08;如&#xff1a;Repository, Logger, ApiClient&#xff…

昇腾310i Pro固件说明

目录 驱动和固件 驱动固件文件 firware固件 24.2版本对应的固件 驱动和固件共同文件 烧结到flash中的固件 总结 启动流程 固件关系猜测 启动关键信息 efuse atu大小 GPU的bar 总结 驱动和固件 以最新的25.2 对应的驱动和固件为例说明&#xff1a; 驱动固件文件…

【LeetCode热题100道笔记】二叉树的右视图

题目描述 给定一个二叉树的 根节点 root&#xff0c;想象自己站在它的右侧&#xff0c;按照从顶部到底部的顺序&#xff0c;返回从右侧所能看到的节点值。 示例 1&#xff1a; 输入&#xff1a;root [1,2,3,null,5,null,4] 输出&#xff1a;[1,3,4] 解释&#xff1a;示例 2&am…

Redis《RedisSerializer》

文章目录RedisSerializer为什么要使用如何使用RedisSerializer总结RedisSerializer 为什么要使用 RedisTemplate 有默认的序列化器&#xff0c;但默认使用的 JdkSerializationRedisSerializer 存在一些问题&#xff1a; 序列化后的数据包含类信息等额外内容&#xff0c;导致…

基于开源AI大模型AI智能名片S2B2C商城小程序的文案引流与社交传播运营策略研究

摘要&#xff1a;本文聚焦开源AI大模型AI智能名片S2B2C商城小程序&#xff0c;探讨其文案引流与社交传播运营策略。阐述文案在引流中的重要性&#xff0c;分析开源AI大模型AI智能名片S2B2C商城小程序的特性&#xff0c;研究文案设计策略、社交传播机制及运营策略实施与效果评估…

NGINX vs HAProxy vs LVS:优势与选型分析

目录 1. 负载均衡的江湖:三巨头初探 2. NGINX:全能选手的多面魅力 NGINX 核心优势 NGINX 的短板 NGINX 实战案例 3. HAProxy:调度大师的精细之道 HAProxy 核心优势 HAProxy 的短板 HAProxy 实战案例 4. LVS:内核猛兽的极致性能 LVS 核心优势 LVS 的短板 LVS 实…

AI+ 行动意见解读:音视频直播SDK如何加速行业智能化

引言&#xff1a;国家战略、技术基座与行业落地 8 月底&#xff0c;国务院发布了《“人工智能”行动意见》&#xff0c;明确将人工智能提升为继“互联网”之后的新一轮国家级战略抓手。这份文件的关键词已经不再是“连接”与“优化”&#xff0c;而是“重塑”与“跃迁”&#…

2025年华为HCIA人工智能认证发展前景如何?客观分析!

大家好&#xff01;7月世界人工智能大会即将揭幕首款重载机器人&#xff0c;AI产业化进程再次加速。不少朋友开始转移关注到和它有一点点关系的——华为HCIA-AI Solution认证&#xff08;人工智能解决方案工程师&#xff09;&#xff0c;但它是否真能搭上这趟技术快车&#xff…

AutoGPT 原理与实践:从AI助理到“自主任务完成者” (人工智能入门系列)

Elon Musk 曾预言&#xff0c;“AIAgent 终将比人类聪明&#xff0c;并能自动完成大部分工作&#xff0c;这既是机遇也是威胁。” 而 AutoGPT&#xff0c;正是当前 AI 领域涌现出的、最能体现这一预言雏形的产品。它不再是那个需要你一句一句精确指令的“AI助手”&#xff0c;而…

自适应滤波器:Ch4 最小均方(LMS)算法

随机梯度下降算法简介 之前的章节中介绍了利用最速下降算法可以实现维纳滤波器的最优解&#xff08;LMMSE&#xff09;&#xff0c;其最优解的形式为&#xff1a; w0R−1Pw_{0} R^{- 1}Pw0​R−1P 它基于两个假设&#xff1a;环境的联合平稳&#xff0c;即输入u(n)u(n)u(n)以及…

AI生成内容的版权问题解析与实操指南

针对个人使用AI工具生成视频/音乐的版权问题深度解析&#xff0c;从法律归属、侵权边界到确权实操&#xff0c;结合最新司法实践提炼核心要点&#xff1a; 一、版权归属核心逻辑&#xff1a;人类智力投入的可视化 当用户深度参与创作过程时&#xff0c;可主张版权。关键看操作…

4.2 机器学习 - 欠拟合和过拟合

模型训练的核心挑战是让模型既 “学好” 训练数据&#xff0c;又能 “适应” 新数据。欠拟合&#xff08;Underfitting&#xff09;和过拟合&#xff08;Overfitting&#xff09;是阻碍这一目标的两大典型问题&#xff0c;其本质是 “模型复杂度” 与 “数据复杂度” 不匹配。本…

LeetCode 468. 验证IP地址 - 详细解析

文章目录LeetCode 468. 验证IP地址 - 详细解析题目描述IPv4验证规则&#xff1a;IPv6验证规则&#xff1a;最优Java解决方案&#xff08;注释完整版&#xff09;关键变量含义及代码技巧代码技巧详解1. 前导零检查的最佳实践2. IPv6为什么不能用Character.isDigit()3. 针对性注释…

新能源研发,用新型实验记录本:ELN

新能源&#xff08;材料&#xff09;研发如火如荼&#xff0c;竞争激烈。以电池为例&#xff0c;新能源汽车的崛起、储能技术的突破&#xff0c;让电池成为了能源领域的“新宠”。电池研发已经成为热门赛场&#xff0c;各研发团队都在与时间赛跑&#xff0c;试图维持优势或弯道…

大语言模型领域最新进展

CSDN大礼包《人工智能大模型课程》 CSDN大礼包《人工智能平台设计开发课程课程》

【网安干货】--计算机网络知识梳理总结(二)

这是计算机网络知识梳理的第二篇&#xff0c;真正去梳理才发现内容好多好多好多好多好多啊…怕是预计要写四篇 注意&#xff1a;如果看不清可以右键复制图片链接到浏览器访问或另存为照片并放大查看 计算机网络2 计算机网络协议2.1 网络协议的定义与核心要素2.1.1 协议的定义2.…

百度前端社招面经二

社招 百度 前端开发 二面 base 北京 react 17 和 18 的差异react的响应式原理&#xff0c;js是如何驱动模块的webpacke 4 和 5 差异webpacke 热更新原理。Tree Shaking 是干嘛的import 和 require 区别&#xff0c;都会被Tree Shaking吗隐藏元素的几种方式三栏布局&#xff0c;…