插入排序,搞起来,一路狂奔,数组插入

文章讲述了如何在C/C++中实现有序数组插入功能,遇到数组越界问题后,通过修复内层循环和处理数组边界来确保程序正确运行。作者详细解释了错误原因及修复过程,包括找到插入位置、移动元素和插入新元素的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 一点喽

目录

编程实现:程序功能是在一个有序序列中插入一个数后,该数列依然有序

输入测试数据:2  3  5  7  8  23  34  56  78  90

25

程序运行结果:插入之后的数组为   2   3   5   7   8  23  25  34  56  78  90

第一个就遇到这么多问题:​编辑

Run-Time Check Failure #2 - Stack around the variable 'arr1' was corrupted.

迅速链接到哥:

 附上代码:

代码解释

初始化

打印原数组

获取用户输入

找到插入位置

移动元素

插入元素

打印新数组

总结


编程实现:程序功能是在一个有序序列中插入一个数后,该数列依然有序

输入测试数据:2  3  5  7  8  23  34  56  78  90

25

程序运行结果:插入之后的数组为   2   3   5   7   8  23  25  34  56  78  90

第一个就遇到这么多问题:

这已经改了4次喽

 裂开

Run-Time Check Failure #2 - Stack around the variable 'arr1' was corrupted.

解决以上:

"Run-Time Check Failure #2 - Stack around the variable 'arr1' was corrupted." 这个错误通常发生在C或C++程序中,当程序试图访问或修改数组arr1边界之外的内存时。这通常意味着程序中有数组越界的错误。

数组越界通常发生在以下几种情况:

  1. 访问数组时使用了错误的索引。比如,数组arr1有11个元素,索引范围应该是0到10(包含),但如果尝试访问arr1[11]或更高的索引,就会越界。

  2. 在移动数组元素时,可能不小心覆盖了数组边界之外的内存。比如,代码中的循环:

for (int j = 10; j > i; j--) {
arr1[j + 1] = arr1[j];
}

如果i等于10,循环不会执行,这是正确的。但是,如果i小于10,j最终会等于i,并且会尝试访问arr1[i + 1],这没有问题,因为要将arr1[i]的值向后移动。然而,紧接着设置arr1[i + 1] = x;,这实际上是在写入arr1数组边界之外的内存,因为有效的索引范围是0到10。

为了修复这个问题,应该确保只写入数组的有效索引范围内。插入代码应该如下所示:

// 将从插入位置开始的元素向后移动一位
for (int j = 9; j >= i; j--) {
arr1[j + 1] = arr1[j];
}
// 在位置i插入新元素x
arr1[i] = x;

注意,这里我们不需要arr1[i + 1] = x;,因为我们已经在上面的循环中将i位置及其后的所有元素向后移动了一位,现在i位置是空的,我们直接在这里插入新元素。

确保程序中没有其他地方访问或修改了arr1数组越界的内存。对于数组操作,始终确保索引在有效范围内(即,0到数组大小减1)。

 

 依旧是问题:

 

迅速链接到哥:

内层循环的写法。内层循环放在了外层循环的条件判断中,这会导致内层循环被错误地多次执行。

注意以下几点:

  1. 内层循环 for (int j = 9; j >= i; j--) 现在正确地只执行一次,用于移动元素。
  2. 在内层循环之后,使用 arr1[i] = x; 来插入新元素 x
  3. 最后一个 for 循环用于打印修正后的数组,其条件现在是 i < 11,因为数组现在包含11个元素。

改用K,真的蛋疼: 

    for (int k = 0; k < 11; k++) 

还是加上,我要吐了:

// 确保不会访问arr1[11],防止数组越界  

 附上代码:

#include<stdio.h>
int main()
{
	int arr1[11] = { 2,3,5,7,8,23,34,56,78,90 };
	int i = 0;
	int x = 0;
	printf("原数组为:");
	for ( i = 0; i <10 ; i++)
	{
		printf("%d  ", arr1[i]);
	}
	printf("\n");
	printf("输入插入的数为:");
	scanf("%d", &x);
	for (i = 0; i < 10 && arr1[i] < x; i++);

	for (int j = 9; j >= i; j--) {
		if (j + 1 < 11)
		{ 
			arr1[j + 1] = arr1[j];
		}
	}
	arr1[i] = x;
	printf("现在数组为:");
	for (int k = 0; k < 11; k++)
	{
		printf("%d  ", arr1[k]);
	}
	printf("\n");
	return 0;
}

 具体解释:

在一个已排序的整数数组 arr1 中插入一个用户输入的整数 x,并且保证插入后数组依然是有序的。接下来逐步解释代码中的每个部分。

代码解释

初始化
int arr1[11] = { 2,3,5,7,8,23,34,56,78,90 };
int i = 0;
int x = 0;

这里定义了一个包含10个元素的数组 arr1,并初始化为一些有序的值。同时定义了两个整数变量 i 和 x,其中 i 用于循环和索引,x 用于存储用户输入的数。

打印原数组
printf("原数组为:");
for ( i = 0; i < 10 ; i++) {
printf("%d ", arr1[i]);
}
printf("\n");

这段代码首先打印出“原数组为:”,然后通过一个 for 循环遍历数组 arr1 的前10个元素,并打印出来。最后打印一个换行符。

获取用户输入
printf("输入插入的数为:");
scanf("%d", &x);

这里提示用户输入一个整数,并使用 scanf 函数读取用户输入的值,存储在变量 x 中。

找到插入位置
for (i = 0; i < 10 && arr1[i] < x; i++);

这个 for 循环用于找到应该插入 x 的位置。它遍历数组 arr1 直到找到一个元素 arr1[i] 不小于 x 或者遍历完所有10个元素。注意,这里的 for 循环后面有一个分号,表示这是一个空循环体,只执行循环控制部分。

移动元素
for (int j = 9; j >= i; j--) {
if (j + 1 < 11) {
arr1[j + 1] = arr1[j];
}
}

这个 for 循环用于将位置 i 及其之后的元素向后移动一位,为插入 x 腾出空间。循环变量 j 从数组的最后一个元素位置开始递减到位置 i。条件 if (j + 1 < 11) 用于防止数组越界,确保不会尝试访问 arr1[11]

插入元素
arr1[i] = x;

在找到插入位置并移动了元素之后,将 x 插入到数组的位置 i 上。

打印新数组
printf("现在数组为:");
for (int k = 0; k < 11; k++) {
printf("%d ", arr1[k]);
}
printf("\n");

最后,打印出新的数组内容,包括新插入的元素 x。这里使用了一个新的循环变量 k 来遍历数组,避免与之前的变量 i 和 j 混淆。

总结

这段代码实现了在一个已排序的数组中插入一个新元素并保持数组有序的功能。它首先找到插入位置,然后移动元素,最后插入新元素并打印新数组。

,准备下一篇

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值