【问题标题】:To perform insert operation in a sorted array在排序数组中执行插入操作
【发布时间】:2021-07-06 17:34:12
【问题描述】:

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

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

【问题讨论】:

  • 请详细说明代码应该做什么。
  • 进行基本调试。使用调试器。如果您逐行浏览代码,您肯定会发现比您已经描述的要多得多。 How to debug small programs.
  • 提问时,请发布可编译代码。那 sn-p 甚至没有编译。 print_arr 中的 arr 是什么?
  • 一个问题是缓冲区溢出:for(int i=0; i&lt;=n; i++) -> for(int i=0; i&lt;n; i++)
  • 问题是一旦你遇到插入Key的条件,你就不想为下一个元素再次插入Key。您可以通过使用布尔变量检查是否已插入 Key 来防止它,否则您可以将 Key 值设置为 (unsigned int)-1 这是整数的最大值以防止再次进入。

标签: arrays c insert function-definition


【解决方案1】:

对于初学者来说,此语句中有一个错字

print_arr(arr, n);

看来你的意思

print_arr( arr_b, n + 1 );

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

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

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

这个for循环

for(int i=0; i<=n; i++)

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

再次声明函数insert_ele的返回类型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 

【讨论】:

    猜你喜欢
    • 2011-03-19
    • 2019-07-15
    • 1970-01-01
    • 2019-02-19
    • 1970-01-01
    • 1970-01-01
    • 2016-05-05
    • 1970-01-01
    相关资源
    最近更新 更多