【考研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
英文地址,請注明出處:http://en.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;…