如何对数组中的多个元素进行插入呢?

问题描述:

如何对数组中的多个元素进行插入呢?比如原数组是 int * pArr = new int[5] {1, 3, 5, 7, 9};如何在下标1和3的位置分别插入数字11和66,要求过程中请注意节省内存空间。分析下面代码和结果,里面的offset是什么意思呢?

方法一:

// Created by 黑马程序员.
#include "iostream"
using namespace std;

/* 在下标1和3插入数字:11和66 */

int main()
{
    // 示例数组
    int * pArr = new int[5] {1, 3, 5, 7, 9};

    // 创建新数组
    int * pNewArr = new int[7];

    // 循环新数组,挨个进行元素填充(非插入的位置,填充老数组元素,插入位置填充新元素)
    int offset = 0;     // 偏移量用来控制新老数组元素的下标对照
    for (int i = 0; i < 7; i++)
    {
        if (i == 1)
        {
            // 走到了下标1,应当执行新元素插入
            pNewArr[i] = 11;
            offset++;       // 每插入一个新元素,offset+1
            continue;
        } else if (i == 3)
        {
            // 走到了下标3,应当执行新元素插入
            pNewArr[i] = 66;
            offset++;       // 每插入一个新元素,offset+1
            continue;
        }

        // 不是插入位置,从老数组中提取元素放入新数组中
        // 公式:老数组的元素下标 + offset = 新数组元素下标
        // 当前循环的i是新数组的元素下标
        pNewArr[i] = pArr[i-offset];
    }

    // 收尾工作
    delete[] pArr;
    pArr = pNewArr;

    // 将新数组的内容输出
    for (int i = 0; i< 7; i++)
    {
        cout << pNewArr[i] << ",";
    }

    return 0;
}
D:\CLion_code\cmake-build-debug\CLion_code.exe
1,11,3,66,5,7,9,
Process finished with exit code 0

代码功能

该代码的功能是将两个新元素 1166 分别插入到原始数组 pArr 的下标 13 位置,并将其他元素适当地移位,最终生成一个包含新元素的数组 pNewArr

代码分析

  1. 数组创建:

    • 创建了一个包含 5 个元素的原始数组 pArr,其初始化为 {1, 3, 5, 7, 9}
    • 创建一个新数组 pNewArr,大小为 7,用于存储插入新元素后的数组。
  2. 元素插入和复制:

    • 使用 for 循环遍历新数组 pNewArr,根据循环变量 i 的值,决定是在对应位置插入新元素还是从原数组中复制元素。
    • offset 变量用于处理原数组中元素的位置偏移。每次插入一个新元素后,offset 会增加 1,这样可以保证后续从原数组中复制的元素位置正确。
  3. 插入操作:

    • i == 1 时,插入新元素 11,并增加 offset
    • i == 3 时,插入新元素 66,并增加 offset
    • 对于其他情况,从原数组中获取元素,将其放置在新数组的相应位置上。
  4. 内存管理:

    • 释放旧数组 pArr 的内存空间,并将 pArr 指向新数组 pNewArr
  5. 输出结果:

    • 循环输出新数组 pNewArr 中的元素,以验证插入后的数组内容。

代码输出结果

代码执行后,程序的输出结果为:

1,11,3,66,5,7,9,

offset 变量的作用

  • offset 是一个控制偏移量的变量,用于管理新数组和旧数组之间的下标对照关系。
  • 每当插入一个新元素后,offset 会增加 1,从而使后续元素的复制能够正确地跳过插入的新元素。
  • pNewArr[i] = pArr[i-offset]; 这行代码中,i-offset 用于获取原数组 pArr 中的对应元素。

总结

该代码成功地在指定位置插入了新元素,并生成了一个包含新元素的数组。通过使用 offset 变量,确保了原数组中的元素能够正确地移动,并插入了新元素。代码在内存管理方面也做得很好,避免了内存泄漏。

 #######################################################

方法二:

为了在数组中插入多个元素,需要重新分配内存,并将原数组元素和新元素按顺序复制到新数组中。以下是具体的操作方法,并对您提供的代码进行分析,解释其中的 offset 含义。

实现插入操作的步骤

  1. 创建新数组: 新数组的大小应该是原数组大小加上插入元素的数量。
  2. 遍历原数组和插入位置: 根据插入元素的位置,将原数组的元素和新元素按顺序放入新数组中。
  3. 管理内存: 释放旧数组的内存,并将新数组的指针赋给旧数组指针。

代码示例

假设您要在下标 13 的位置插入数字 1166,可以使用如下代码实现:

#include "iostream"
using namespace std;

int main()
{
    // 示例数组
    int * pArr = new int[5] {1, 3, 5, 7, 9};

    // 创建一个新数组,容量为原数组容量加上插入元素的数量
    int * pNewArr = new int[7];

    int offset = 0;  // 偏移量控制变量
    for (int i = 0; i < 5; i++)
    {
        // 插入11到下标1的位置
        if (i == 1)
        {
            pNewArr[i+offset] = 11;
            offset++;  // 每插入一个新元素,偏移量加1
        }

        // 插入66到下标3的位置
        if (i == 3)
        {
            pNewArr[i+offset] = 66;
            offset++;  // 再插入一个新元素,偏移量再加1
        }

        pNewArr[i+offset] = pArr[i];
    }

    // 将老数组的空间回收
    delete[] pArr;

    // 将老数组的指针对象,指向新数组的空间
    pArr = pNewArr;

    // 将新数组的内容输出看一下
    for (int i = 0; i < 7; i++)
    {
        cout << pNewArr[i] << endl;
    }

    return 0;
}

代码解释

  • 偏移量 offset 的作用: offset 用来调整新数组的下标。每当在指定位置插入一个新元素时,offset 就加 1,确保在复制原数组的元素时,新元素不会被覆盖,并且后续的元素能够正确排列到新数组中。
  • 新数组 pNewArr 的创建: 新数组的大小为 7,因为原数组有 5 个元素,并且需要插入 2 个新元素,所以新数组的大小为 5 + 2 = 7
  • 内存管理: 旧数组的内存通过 delete[] pArr 被释放,避免内存泄漏。然后,将 pArr 指向新数组,使得后续操作依然可以使用 pArr

输出结果

运行程序后,新数组的内容应为:

1
11
3
66
5
7
9

如预期,在原数组 1, 3, 5, 7, 9 中下标 1 处插入了 11,下标 3 处插入了 66

结论

通过偏移量 offset 的控制,我们能够灵活地在数组中插入多个元素,确保新数组中元素的位置正确排列。这样做不仅节省了内存空间,也使得数组操作更加灵活和高效。

 

  • 3
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 好的,这是一个典型的排序和插入问题,以下是示例代码: ```c #include <stdio.h> void sort(int arr[], int n) { int i, j, temp; for (i = 0; i < n - 1; i++) { for (j = 0; j < n - i - 1; j++) { if (arr[j] > arr[j + 1]) { temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; } } } } void insert(int arr[], int n, int x) { int i, j; for (i = 0; i < n; i++) { if (arr[i] > x) { for (j = n - 1; j >= i; j--) { arr[j + 1] = arr[j]; } arr[i] = x; break; } } if (i == n) { arr[n] = x; } } int main() { int arr[10], i, x; printf("请输入9个整数:\n"); for (i = 0; i < 9; i++) { scanf("%d", &arr[i]); } sort(arr, 9); printf("排序后的数组为:\n"); for (i = 0; i < 9; i++) { printf("%d ", arr[i]); } printf("\n请输入要插入的整数:\n"); scanf("%d", &x); insert(arr, 9, x); printf("插入后的数组为:\n"); for (i = 0; i < 10; i++) { printf("%d ", arr[i]); } printf("\n"); return 0; } ``` 输入示例: ``` 请输入9个整数: 9 8 7 6 5 4 3 2 1 排序后的数组为: 1 2 3 4 5 6 7 8 9 请输入要插入的整数: 0 插入后的数组为: 0 1 2 3 4 5 6 7 8 9 ``` 希望这个示例代码能够帮到你! ### 回答2: 在主函数中,可以定义一个长度为10的整型一维数组arr。接下来,通过循环让用户输入9个数据,并将这些数据存入数组arr中。 然后,可以调用一个函数sortArr来对数组元素进行从小到大排序。在sortArr函数中,可以使用冒泡排序算法对数组进行排序。冒泡排序的核心思想是相邻元素两两比较,将较小的元素往前移。通过多次循环比较和交换,直到所有元素按照从小到大的顺序排序。 接着,在sortArr函数中再输入一个数insertNum。然后,可以使用循环遍历数组arr,找到第一个大于insertNum的元素的位置。在找到该位置之后,可以将后面的元素都往后移,给insertNum腾出正确的位置。最后,将insertNum插入到该位置上,数组长度加一,并输出排序后的新数组。 最后,在主函数中输出排序后的数组。以下是实现的例程: #include<iostream> using namespace std; void sortArr(int arr[], int n, int insertNum) { arr[n] = insertNum; int temp; for (int i = 0; i < n+1; i++) { for (int j = 0; j < n-i; j++) { if (arr[j] > arr[j+1]) { temp = arr[j]; arr[j] = arr[j+1]; arr[j+1] = temp; } } } } int main() { int arr[10]; int insertNum; cout << "请输入9个整数:" << endl; for (int i = 0; i < 9; i++) { cin >> arr[i]; } cout << "请输入要插入的整数:" << endl; cin >> insertNum; sortArr(arr, 9, insertNum); cout << "排序后的数组为:" << endl; for (int i = 0; i < 10; i++) { cout << arr[i] << " "; } return 0; } ### 回答3: 在主函数中定义一个有10个元素的整型一维数组arr[10]。用户输入9个数据,将这9个数据分别存入数组arr[0]到arr[8]中。 ``` #include <iostream> using namespace std; void insertNum(int arr[], int num) { int i, j; for (i = 0; i < 9; i++) { if (num < arr[i]) { break; } } for (j = 9; j > i; j--) { arr[j] = arr[j-1]; } arr[i] = num; cout << "插入后数组的正确顺序为:"; for (i = 0; i < 10; i++) { cout << arr[i] << " "; } cout << endl; } int main() { int arr[10]; cout << "请输入9个整数:" << endl; for (int i = 0; i < 9; i++) { cin >> arr[i]; } cout << "请输入一个要插入的数:"; int num; cin >> num; insertNum(arr, num); return 0; } ``` 在函数`insertNum`中,遍历数组查找到插入位置。如果找到了插入位置,则将该位置后的所有元素都往后移一位,空出插入位置。最后将需要插入的数插入到该位置,并输出插入后数组的正确顺序。 在主函数中,首先定义一个有10个元素的整型数组`arr`。用户输入的前9个数据依次存入数组`arr[0]`到`arr[8]`中。接着用户再输入一个要插入的数,调用函数`insertNum`进行插入,并输出插入后数组的正确顺序。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

神笔馬良

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值