【问题标题】:Remove even numbers from array in c从c中的数组中删除偶数
【发布时间】:2015-11-24 18:31:48
【问题描述】:

您好,我正在尝试大约 2 小时来创建一个程序,该程序将从 c 中的 dinamyc 分配的数组(使用 malloc)中删除偶数。有人可以帮助我提供一些提示或创建代码。

附言这是我在这里的第一个主题,所以请随时给我一些关于如何正确发布问题的提示。

【问题讨论】:

  • 到目前为止你有什么?帮助意味着纠正你的错误,这样你就可以从中吸取教训。为他们做别人的工作对任何人都没有帮助
  • @AnoopKanyan 那是 C++ 而不是 C
  • 显示您拥有的代码。
  • @Gabriel 请不要恨我,但如果你没有真正向我们表明你需要帮助,你不应该寻求帮助。有什么原因,您为什么不向我们展示您的代码?

标签: c arrays pointers malloc


【解决方案1】:

假设您已经动态分配了一个包含 n 个元素的数组并对其进行了初始化。

在这种情况下,删除偶数元素的函数可以如下所示

size_t remove_even( int *a, size_t n )
{
    size_t m = 0;

    for ( size_t i = 0; i < n; i++ )
    {
        if ( a[i] % 2 != 0 )
        {
            if ( i != m ) a[m] = a[i];
            ++m;
        }
    }

    return m;
}

可以这样调用

size_t m = remove_even( p, n );

for ( size_t i = 0; i < m; i++ ) printf( "%d ", a[i] );
printf( "\n" );

其中 p 是指向动态分配的 n 个元素数组的指针。

该函数实际上没有删除任何内容。它只是将奇数元素移动到数组的开头。

然后您可以使用标准 C 函数 realloc 物理删除已删除的元素。

例如

int *tmp = realloc( p, m * sizeof( int ) );

if ( tmp != NULL ) p = tmp;

这是一个演示程序

#include <stdlib.h>
#include <stdio.h>

size_t remove_even( int a[], size_t n )
{
    size_t m = 0;

    for ( size_t i = 0; i < n; i++ )
    {
        if ( a[i] % 2 != 0 )
        {
            if ( i != m ) a[m] = a[i];
            ++m;
        }
    }

    return m;
}

#define N   10

int main( void )
{
    int *a = malloc( N * sizeof( int ) );

    for ( size_t i = 0; i < N; i++ ) a[i] = i;

    for ( size_t i = 0; i < N; i++ ) printf( "%d ", a[i] );
    printf( "\n" );

    size_t m = remove_even( a, N );

    int *tmp = realloc( a, m * sizeof( int ) );

    if ( tmp != NULL ) a = tmp;

    for ( size_t i = 0; i < m; i++ ) printf( "%d ", a[i] );
    printf( "\n" );

    free( a );
}

它的输出是

0 1 2 3 4 5 6 7 8 9 
1 3 5 7 9 

【讨论】:

    【解决方案2】:

    在尝试编写代码之前,您需要检查一些事情,但我发现没有您显示使用的代码。

    SO 不是一个教程网站,因此这意味着您应该向我们展示一些实际编译的代码,并在此处询问该代码是否存在问题。

    无论如何,这段代码应该会给你一个关于如何检查数字是oddeven的想法:

    #include<stdio.h>
    #include<stdlib.h>
    
    int main(void){
        int n;
    
        printf("Enter an integer:>  ");
        if((scanf("%d", &n)) != 1){
            printf("Error, Fix it!\n");
            exit(1);
        }
    
        if (n%2 == 0){
            printf("Even\n");
        }else{
            printf("Odd\n");
        }
    
        return 0;
    }
    

    这里的整个故事不是关于检查数组中的数字是odd还是even,而是要找到一种方法来检查一个数字是odd还是even,然后才应该检查如果在该数组中有oddeven 数字。希望你能理解我的意思。

    【讨论】:

      猜你喜欢
      • 2022-12-21
      • 2019-12-31
      • 1970-01-01
      • 1970-01-01
      • 2016-01-31
      • 2017-02-06
      • 1970-01-01
      • 2011-01-06
      相关资源
      最近更新 更多