数组元素的插入
面对数组元素的插入,我们通常采用将指定位置及以后的元素均赋值给下一位数组元素,以此达到添加的作用。
例如:
一个数组arr[]={1,2,4,5,6}共有5位元素,要在第二位元素与第三位元素间插入一个新的元素,那么,我们就需要将第三位元素(下标为 2 )赋值给第四位元素(下标为 3 ),第四位元素赋值给第五位元素(下标为4),第五位元素赋值给第六位元素(下标为5),为了实现这个目的,我们需要从后往前以此赋值,如下:
for(i=4;i>=2;i--)
arr[i+1]=arr[i];
如此便把第三位之后的元素赋值完成。
说明:
在对元素赋值时,一定要从后往前赋值,如果改为一下程序会是什么结果?
for(i=2;i<5;i++)
arr[i+1]=arr[i];
此时第三位元素并未确定,因此我们需要在上一部循环结束后定义第三位元素的值,例如我们要插入的第三位元素为3,那么有
arr[2]=3;
此刻,便完成了新的数组元素的排序,但是由于数组元素增加了,所以我们也需要对数组标识常量+1。
数组元素的删除
数组元素删除可以采用覆盖的方法,将需要删除的元素之后的所有元素均向前一位元素赋值。
例如:
同上述数组,如果我们需要删去第3位元素,那么就需要我们把第四位元素(小标为3)值赋值给第三位元素(下标为2),第五位元素(下标为4)赋值给第四位元素即可完成对三位元素的删除。即:
for(i=2;i<4;i++)
arr[i]=arr[i+1];
如此便完成了数组元素的删除,但是同增加元素类似,数组的元素个位发生了减少,为此需要在将数组标识常量-1。
附:数组任意指定元素的增加和删出(未考虑元素溢出问题)
#include<stdio.h>
int main()
{
int x, y, i, j, N;
int arr[] = { 2,5,7,8,9 };
N = sizeof(arr) / sizeof(arr[0]);//计算数组的元素个数
printf("插入元素前的数组是:\n");
for (i = 0; i < 5; i++)
{
printf("%d ", arr[i]);
}
printf("\n");
do
{
printf("输入要插入的元素的位置和大小\n");
scanf_s("%d %d", &j, &x);//中间用一个空格键隔开输入的数据
if (0 <= j && j <= N+1)//判断元素插入的位置是否超出空间
{
for (i = N - 1; i >= j - 1; i--)
{
arr[i + 1] = arr[i];
} //注意:需要从后往前依次将前一位元素赋值给后一位
arr[j - 1] = x; //将元素插入固定位置
N++; //增加数组元素个数
printf("插入后的数组是:\n");
for (i = 0; i < N; i++)
{
printf("%d ", arr[i]);
}
printf("\n");
}
else
printf("输入的数据溢出范围,请重新输入!\n");
}while (j>N+1||j<0); // 判断是否执行循环的条件,在超出范围后将重新输入
do
{
printf("请输入你要删除第几位元素:\n");
scanf_s("%d", &y);
if (0 <= y && y <= N)
{
for (i = y - 1; i < N - 1; i++)//判断元素插删除的元素是否超出空间
{
arr[i] = arr[i + 1];
} //用需要删除的后一位元素覆盖前一位元素
N--; //减少元素个数
printf("删除指定位置元素后的数组为:\n");
for (i = 0; i < N; i++)
{
printf("%d ", arr[i]);
}
}
else
printf("输入的数据溢出范围,请重新输入!\n");
} while (y<0 || y>=N + 1);//判断是否执行循环的条件,在超出范围后将重新输入
return 0;
}