首页 > 解决方案 > 在排序数组中执行插入操作

问题描述

这段代码有什么问题,问题出在哪里?我多次运行此代码,但它显示代码正在运行,但我没有得到任何输出。你能告诉我错误在哪里吗?

#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;
}

标签: arrayscinsertfunction-definition

解决方案


对于初学者来说,这个声明中有一个错字

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 

推荐阅读