首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >在排序数组中执行插入操作

在排序数组中执行插入操作
EN

Stack Overflow用户
提问于 2021-04-11 20:06:35
回答 1查看 36关注 0票数 0

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

代码语言:javascript
代码运行次数:0
运行
复制
#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;
}
EN

回答 1

Stack Overflow用户

发布于 2021-04-11 21:05:29

对于初学者来说,这条语句中有一个拼写错误

代码语言:javascript
代码运行次数:0
运行
复制
print_arr(arr, n);

看起来你是说

代码语言:javascript
代码运行次数:0
运行
复制
print_arr( arr_b, n + 1 );

函数print_arr的返回类型int没有意义,也没有用。

函数的第一个参数应该具有限定符const,因为传递的数组在函数中没有更改。

第二个参数的类型应该是size_t

这是for循环

代码语言:javascript
代码运行次数:0
运行
复制
for(int i=0; i<=n; i++)

如果函数的用户将在第二个参数n中传递数组中的元素数量,则可以调用未定义的行为,因为在这种情况下,将尝试访问数组以外的内存。

同样,函数insert_ele的返回类型int没有任何意义,也是无用的。

第一个参数应该具有限定符const,因为源数组不会在函数中更改。参数n的类型应为size_t

该函数存在逻辑错误。

让我们假设变量Key的值小于数组arr_a的所有元素的值。

在这种情况下,索引j将递增两次,因此您将拥有

代码语言:javascript
代码运行次数:0
运行
复制
b[0] = Key; b[2] = Key; b[4] = Key; and so on.

如果将for循环拆分为两个for循环,那么函数的逻辑就会清晰得多。

程序可以看起来像下面这样。

代码语言:javascript
代码运行次数:0
运行
复制
#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;
}

程序输出为

代码语言:javascript
代码运行次数:0
运行
复制
12 16 20 26 40 50 
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67044793

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档