【问题标题】:Count greater elements on right side of a current element in an array计算数组中当前元素右侧的更大元素
【发布时间】:2017-03-31 03:10:02
【问题描述】:

我正在尝试计算大于数组右侧元素的元素数。我的功能就到这里了。

int* SurpassersKing(int input1_size, int* input1,int* output_size)
    {
        int i,k;
        int count[input1_size];
        for  (i = 0; i < input1_size; i++)
            count[i] = 0;


        for ( i = 0; i < input1_size; i++) 
        {
            for ( k = i + 1; k <input1_size; k++) 
                {
                        if (input1[i] < input1[k]) {
                                 count[i]++;
                        }
                }
        } 

        return count;
    }

这是我计算数组中更大元素的函数。

因此,在下面的代码 sn-p 中,我编写了 main 函数,声明了所有可验证的变量,如 output_size、计数数组、i、k 作为数组的索引并打印内容,并调用计数函数。

int main() {
    int output_size;
    int* output;

    int ip1_size = 0;
    int ip1_i;
    scanf("%d\n", &ip1_size);
    int ip1[ip1_size];
    for(ip1_i = 0; ip1_i < ip1_size; ip1_i++) {
        int ip1_item;
        scanf("%d", &ip1_item);

        ip1[ip1_i] = ip1_item;
    }
    output = SurpassersKing(ip1_size,ip1,&output_size);
    int output_i;
    for(output_i=0; output_i < output_size; output_i++) {

        printf("%d\n", output[output_i]);

    }
    return 0;
}

但我没有得到所需的输出,所以我可以做些什么来改进它。

【问题讨论】:

  • 请将所有代码作为格式化文本放入问题中。不是作为外部链接,当然也不是作为图像。
  • 这是我附加的图片
  • 不是作为图片
  • return count;。那是错误的。不能从函数返回指向局部变量的指针。函数退出后无效。
  • 两个常用选项: 1. 返回动态分配的内存。 2. 调用者传入函数用于输出结果的缓冲区。

标签: c arrays


【解决方案1】:

您计算右侧数字计数的逻辑是正确的。唯一的问题是你不能从函数中返回这样的数组。请尝试以下操作:

替换

int count[input1_size];

int * count = malloc(input1_size*sizeof(int));

然后在main函数中

添加

free(output);

就在 return 语句之前。

【讨论】:

  • 我可以免费使用(输出)吗?在本地函数中
  • 在完成使用之前无法释放它。您在主函数的最后一个循环中完成使用它
  • 有什么办法可以不使用免费(输出)并让它上路
  • 或者如何将数组与 output_size 一起返回给主函数,提前谢谢
  • 在这种情况下,输出大小始终与输入大小相同。
【解决方案2】:

你的代码在我尝试编译时发现了一些错误。

  1. 这是一个 c 代码,所以使用#include

  2. 在 SurpassersKing 函数内部,您试图返回不允许的数组计数。除非是动态创建的,否则永远不要返回局部变量。

  3. output_size 永远不会被初始化。

这是最终代码:

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

int* SurpassersKing(int input1_size, int* input1)
{
    int i,k;
    int * count = (int*)malloc(input1_size*sizeof(int));
    for  (i = 0; i < input1_size; i++)
        *(count + i) = 0;


    for ( i = 0; i < input1_size; i++) 
    {
        for ( k = i + 1; k <input1_size; k++) 
            {
                    if (input1[i] < input1[k]) {
                             count[i]++;
                    }
            }
    } 

    return count;
}

int main() {
// your code goes here
int output_size;
int* output;

int ip1_size = 0;
int ip1_i;
int output_i;

printf("Enter the size:\n");
scanf("%d",&ip1_size);
int ip1[ip1_size];
for(ip1_i = 0; ip1_i < ip1_size; ip1_i++) {
    scanf("%d",%ip1[ip1_i]);
}
output = SurpassersKing(ip1_size,ip1);
output_size = ip1_size;

for(output_i=0; output_i < output_size; output_i++) {

    printf("%d\n",output[output_i]");

}
return 0;
}

【讨论】:

  • 如果问题是 c,您不能使用 iostream、命名空间以及声明之间
  • 我不是 C 方面的专家,但如果 ip1_size 不是常数,你能做到 int ip1[ip1_size]; 吗?
  • @DavidBowling...好的
  • @Logman——这是一个可变长度数组,在 C99 中被添加到标准中。它在 C11 中是可选的,但似乎得到了 C11 实现的良好支持。
  • @Arvindsinc2 动态表大小可能难以在函数堆栈上分配。通常你在堆上分配动态内存。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-07
相关资源
最近更新 更多