发布日期 :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;需要处理回车换行带来缓冲区问题。