0

数组在代码中定义,我们应该计算数组中正数的数量并创建一个新数组,如果原始数组中的正数大于原始数组中的负数,则将所有正数插入其中,并且如果相反(负数大于正数,我们创建一个新数组并插入所有负数)

如果它相等(正数和负数),我们创建一个新数组并首先插入所有正数,然后插入所有负数

*我们必须用malloc在函数中创建数组..

编码 :

#include <stdio.h>
#define n 10
void func(int *arr)
{
    int i,j,c1=0,c2=0,mat;
    for(i=0;i<n;i++)
    {
        if (*arr>=0) c1++;
        else c2++;
        arr++;
    }
    if(c1>c2)
    {
        mat=(int *)malloc(c1*sizeof(int));
        for(i=0;i<c1;i++)
        if(*arr>0)
        {
         mat=*arr;
         mat++;
         arr++;
        }
    }
        else   if(c2>c1)
     {
        mat=(int *)malloc(c2*sizeof(int));
        for(i=0;i<c2;i++)
        if(*arr<0)
        {
         mat=*arr;
         mat++;
         arr++;
        }
    }
    else
    {
        mat=(int *)malloc((c1+c2)*sizeof(int));
        for(i=0;i<n;i++)
        if(*arr>0)
        {
         mat=*arr;
         mat++;
         arr++;
        }
        for(i=0;i<n;i++)
        if(*arr<0)
        {
         mat=*arr;
         mat++;
         arr++;
        }
    }
}
main()
{
    int array={6,3,5,-5,4,3,-6,-9,6,-16};
    int *arr=array;
    func(arr);
}
4

3 回答 3

0

我认为它现在正在工作,并进行了以下修改(同时试图保持你的整个想法): 1. mat 是 int* 而不是 int,也返回并释放 2. 对数组的索引访问而不是指针算术(并丢失arr指针,举例) 3. 更多的测试用例。

我希望这是一个好的解决方案,祝你好运!

#include <stdio.h>
#include <malloc.h>

#define n 10
int* func(int *arr, int* size)
{
int i,j=0,c1=0,c2=0;
int* mat;
for(i=0;i<n;i++)
{
    if (arr[i]>=0) c1++;
    else c2++;
    //arr++;
}
if(c1>c2)
{
    *size = c1;
    mat=(int *)malloc(c1*sizeof(int));
    for(i=0;i<n;i++)
    if(arr[i]>=0)
    {
     mat[j]=arr[i];
     //mat++;
     //arr++;
     j++;
    }
}
    else   if(c2>c1)
 {
     *size = c2;
    mat=(int *)malloc(c2*sizeof(int));
    for(i=0;i<n;i++)
    if(arr[i]<0)
    {
     mat[j]=arr[i];
     //mat++;
     //arr++;
     j++;
    }
}
else
{
    *size = c1+c2;
    mat=(int *)malloc((c1+c2)*sizeof(int));
    for(i=0;i<n;i++)
    if(arr[i]>=0)
    {
     mat[j]=arr[i];
     //mat++;
     //arr++;
     j++;
    }
    for(i=0;i<n;i++)
    if(arr[i]<0)
    {
     mat[j]=arr[i];
     //mat++;
     //arr++;
     j++;
    }
}

    return mat;
}
void main()
{
//int array[n]={6,3,5,-5,4,3,-6,-9,6,-16};
//int array[n]={6,-2,-5,4,3,-6,-9,6,-16, -1};
int array[n]={-6,3,5,-5,4,3,-6,-9,6,-16};
int *arr=array;
int size;
int* mat = func(arr, &size);
for (int i = 0; i < size; ++i)
    printf("%d ", mat[i]);
printf("\n");
free(mat);
}
于 2013-05-21T14:04:48.873 回答
0
#include <stdio.h>
#include <stdlib.h>

#define N 10

int *func(int *arr, int *size){//arr: input array, size : size of array, I/O
    int *ap, *an, *mat;//array positive, array negative, return value;
    int psize, nsize;//size of positive array, size of negative array 
    int i;

    ap = (int*)malloc(*size * sizeof(int));//check return value, omission
    an = (int*)malloc(*size * sizeof(int));
    psize = nsize = 0;
    for(i=0;i < *size;++i){
        if(arr[i]>=0){
            ap[psize++] = arr[i];
        } else {
            an[nsize++] = arr[i];
        }
    }
    if(psize > nsize){
        mat = realloc(ap, sizeof(int)*psize);
        *size = psize;
        free(an);
    } else if(psize < nsize){
        mat = realloc(an, sizeof(int)*nsize);
        *size = nsize;
        free(ap);
    } else {
        mat = ap;
        for(i=0;i<nsize;++i)
            mat[psize + i] = an[i];
        //*size = *size
        free(an);
    }
    return mat;
}

int main(void){
    int array[N] = {6,3,5,-5,4,3,-6,-9,6,-16};
    int *arr, size = N;
    int i;

    arr=func(array, &size);//need size of the returned array

    for(i=0;i<size;++i){
        printf("%d ", arr[i]);
    }
    free(arr);

    return 0;
}
于 2013-05-21T14:05:28.003 回答
0

该程序有 2 个最常见的编程错误。

1.) mat=(int *)malloc(c1*sizeof(int));

mat被声明为整数。malloc返回一个指向已分配内存的 void 指针,然后您将其转换为整数指针。因此mat应该是指向整数而不是整数的指针。的声明mat应如下所示。

int *mat;

2.)arr++;

使用数组索引来访问数组而不是数组算术运算。

用数组算术arr将指向数组的末尾。接下来,当您 increment 时arr,它会尝试访问可能导致崩溃的数组边界之外的内容。

于 2013-05-22T06:07:59.103 回答