数组元素的插入和删除

数组元素的插入

面对数组元素的插入,我们通常采用将指定位置及以后的元素均赋值给下一位数组元素,以此达到添加的作用。

例如:

一个数组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;
}

  • 13
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值