arrays - 在排序数组中执行插入操作
问题描述
这段代码有什么问题,问题出在哪里?我多次运行此代码,但它显示代码正在运行,但我没有得到任何输出。你能告诉我错误在哪里吗?
#include <stdio.h>
int print_arr(int *arr, int n)
{ for(int i=0; i<=n; i++)
{
printf("%d ",arr[i]);
}
return 0;
}
int insert_ele(int *arr_a, int *arr_b, int n, int Key)
{
int i,j;
for(i=0, j=0; i<n; i++, j++)
{
if(arr_a[i]>Key)
{
arr_b[j] = Key;
arr_b[j+1] = arr_a[i];
j++;
}
else
{
arr_b[j] = arr_a[i];
}
}
return 0;
}
int main()
{
//code
int arr_a[] = {12, 16, 20, 40, 50, 70};
int arr_b[10];
int Key = 26;
int n = sizeof(arr_a)/sizeof(arr_a[0]);
int indx = insert_ele(arr_a, arr_b, n, Key);
print_arr(arr, n);
return 0;
}
解决方案
对于初学者来说,这个声明中有一个错字
print_arr(arr, n);
看来你的意思
print_arr( arr_b, n + 1 );
int
函数的返回类型print_arr
没有意义,也没用。
函数的第一个参数应该有限定符const
,因为传递的数组在函数内没有改变。
第二个参数应该是 type size_t
。
这个for循环
for(int i=0; i<=n; i++)
如果函数的用户将在第二个参数中传递数组中元素的数量,则可以调用未定义的行为,n
因为在这种情况下,将尝试访问数组之外的内存。
int
同样,函数的返回类型insert_ele
没有意义并且没用。
第一个参数应该有限定符const
,因为源数组在函数中没有被改变。参数n
应具有类型size_t
。
该函数存在逻辑错误。
假设变量的值Key
小于数组所有元素的值arr_a
。
在这种情况下,索引 j 将增加两次,结果您将拥有
b[0] = Key; b[2] = Key; b[4] = Key; and so on.
如果将 for 循环分成两个 for 循环,函数的逻辑将非常清晰。
该程序可以如下所示。
#include <stdio.h>
size_t insert_ele( const int *a, size_t n, int *b, int key )
{
size_t i = 0;
for ( ; i < n && !( key < a[i] ); i++ )
{
b[i] = a[i];
}
b[i] = key;
for ( ; i < n; i++ )
{
b[i+1] = a[i];
}
return i;
}
FILE * print_arr( const int *a, size_t n, FILE *fp )
{
for ( size_t i = 0; i < n; i++)
{
fprintf( fp, "%d ", a[i] );
}
return fp;
}
int main(void)
{
int a[] = { 12, 16, 20, 40, 50, 70 };
const size_t N = sizeof( a ) / sizeof( *a );
int b[10];
int key = 26;
size_t m = insert_ele( a, N, b, key );
fputc( '\n', print_arr( b, m, stdout ) );
return 0;
}
程序输出为
12 16 20 26 40 50
推荐阅读
- javascript - 为什么 Reduce Helper 返回 NaN?
- c - 如果平台上“long”和“int”的大小相同 - “long”和“int”有什么不同吗?
- javascript - Render() 状态元素最初是空的,直到 api 调用
- android-safe-args - 在多模块项目中移动 SafeArgs
- r - 选择行数据复制
- keras - Faster RCNN 不产生边界框
- ios - 您可以使用 xcconfig 更改项目中安装的 sdk 吗?
- c# - 如何检索日期等于或不等于输入类型 date .value 和从 asp.net 中的数据库日期列
- flutter - 来自 json 的 Flutter ExpansionTile
- javascript - Flutter:FormatException:意外字符(在字符1处)