C 语言数组添加和删除元素的实现

发布日期 :2026-09-07 07:44:58 UTC

作者 :xuzhiping

访问量: 10 次浏览

一、基础原理

C 语言静态数组内存连续。数组查找访问速度快,但插入、删除效率低

1.插入元素:插入下标之后全部元素向后移位,腾出空位存放新元素。

2.删除元素:删除下标之后全部元素向前移位,覆盖待删除的元素。

静态数组长度固定,示例采用新建数组保存结果,也可以在足够大的原数组内移位实现。

二、指定下标插入元素

逻辑:新建长度 + 1 的数组;下标小于插入位置直接复制;下标等于插入位置存入新值;大于插入位置,取原数组 i‑1 位置数据(向后偏移)。

示例代码

# include <stdio.h>
int main(void)
{
  int a[23] = {1, 5, 66, 8, 55, 9, 1, 32, 5, 65, 4, 8, 5, 15, 64, 156, 1564, 15, 1, 8, 9, 7, 215};
  int b[24]; // 插入后数组长度+1
  int Index; // 插入下标
  int num;   // 插入数值
  int i;

  printf("请输入插入值的下标:");
  scanf("%d", &Index);
  printf("请输入插入的数值:");
  scanf("%d", &num);

  for (i=0; i<24; ++i)
  {
    if (i < Index)
    {
      b[i] = a[i];
    }
    else if (i == Index)
    { 
      b[i] = num;
    }
    else
    {
      b[i] = a[i-1]; // 原数组元素向后挪一位
    }
  }

  for (i=0; i<24; ++i)
  {
    printf("%d ", b[i]);
  }
  printf("\n");
  return 0;
}

运行示例:

输入下标10,插入数值22

输出:1 5 66 8 55 9 1 32 5 65 22 4 8 5 15 64 156 1564 15 1 8 9 7 215

三、指定下标删除元素

逻辑:新建长度‑1 数组;下标小于删除位置直接复制;大于等于删除位置,取原数组 i+1 的数据,实现后续元素整体前移覆盖。

示例代码

# include <stdio.h>
int main(void)
{
  int a[23] = {1, 5, 66, 8, 55, 9, 1, 32, 5, 65, 4, 8, 5, 15, 64, 156, 1564, 15, 1, 8, 9, 7, 215};
  int b[22]; // 删除后数组长度‑1
  int Index; // 删除下标
  int i;

  printf("请输入要删除的值的下标:");
  scanf("%d", &Index);

  for (i=0; i<23; ++i)
  {
    if (i < Index)
    {
      b[i] = a[i];
    }
    else
    {
      b[i] = a[i+1]; // 后面元素整体前移
    }
  }

  for (i=0; i<22; ++i)
  {
    printf("%d ", b[i]);
  }
  printf("\n");
  return 0;
}

运行示例:

输入删除下标5

输出:1 5 66 8 55 1 32 5 65 4 8 5 15 64 156 1564 15 1 8 9 7 215

四、综合案例:有序数组插入删除

需求:初始有序数组{5, 9, 11, 16, 24, 34, 37, 49, 51, 61}

1.输入D:输入待删除整数,删除该数值,数组保持升序;禁止冒泡、选择排序。

2.输入I:输入待插入整数,找到位置插入,数组保持升序;禁止冒泡、选择排序。

注意:getchar 读取数字字符存在陷阱,多位数字不能使用 getchar 读取数值,应当使用scanf_s

示例代码

#include <stdio.h>
int main()
{
 int a[10] = { 5, 9, 11, 16, 24, 34, 37, 49, 51, 61 };
 int i = 0,n=0,k=0;
 char get;

 for (i = 0; i < 10; i++)
  printf("%3d", a[i]);
 printf("\n");

 printf("请输入需要进行的操作(插入‘I',删除‘D')\n");
 get = getchar();
 getchar(); // 吸收回车符

 if (get=='D')
 {
  printf("请输入要删除的整数:\n");
  scanf("%d",&n);
  for (i = 0; i < 10; i++)
  {
  if (a[i]==n)
  {
   for (; i < 10; i++)
   {
    a[i] = a[i + 1];
   }
   a[9] = 0;
   break;
  }
  }
 for (i = 0; i < 9; i++)
  printf("%3d", a[i]);
 printf("\n");
 }

 printf("请输入需要进行的操作(插入‘I',删除‘D')\n");
 get = getchar();
 getchar();

 if (get=='I')
 {
 printf("请输入要插入的整数:\n");
 scanf("%d", &n);
 for (i = 0; i < 10; i++)
 {
  if (a[i] < n&&n < a[i + 1])
  {
  k = i;
  for (i = 8; i > k; i--)
  {
   a[i+1] = a[i];
  }
  a[k+1] = n;
  break;
  }
 }
 for (i = 0; i < 10; i++)
  printf("%3d", a[i]);
 }
 return 0;
}

样例运行:

初始数组:5 9 11 16 24 34 37 49 51 61

输入操作D,删除数字9

输出:5 11 16 24 34 37 49 51 61

输入操作I,插入数字13

输出:5 11 13 16 24 34 37 49 51 61

五、关键点总结

1.静态数组大小固定,插入删除依靠元素移位,时间复杂度 O (n);数据量大效率差。

2.插入:插入点之后元素向后挪;删除:删除点之后元素向前挪。

3.有序数组插入删除:先查找目标位置,再移位,不需要重新整体排序。

4.getchar 只读取单个字符,读取多位整数应当使用 scanf;需要处理回车换行带来缓冲区问题。