如何按照规则

时间:2017-01-28 11:10:19

标签: c arrays sorting

我有一个问题。我需要做一个接收2个大小为n,m的数组的函数。并以最小长度返回一个公共数字的新数组。  例如:

      A: 2 5 3 1 2 4 6 2 4 3 5 2

      B: 7 5 2 5 8 1 2 5 9 2

和新阵列看起来像:

      C:  1 2 2 2 5 5 

并且新数组的大小必须为6.

这是我到目前为止所做的。 (但它没有工作,我找不到问题)

 int *same_same(int *ar1, int *ar2,int n, int m)
{
    int *c; 
    int i=0,j=0,k=0;
    int min=n;
    if (n>m)
        min=m;
    c=(int *)calloc(min, sizeof(int)); 
    bubble_sort (ar1, n);
    bubble_sort (ar2, m);

while( i<n  &&  j<m ) 
{ 
    if (ar1[i] == ar2[j])
    {
        c[k++]=ar1[i++];
        j++;

    }
    else if (ar1[i] < ar2[j])
        i++;
    else j++;

} 
c=(int *)realloc(k, sizeof(int));
return c;
free (c);
}

完整代码为:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
#include <assert.h>
int *input_array_dyn(int n)
{ 
    int i;  
    int *a; 
    a=(int *)calloc(n, sizeof(int)); 
    assert(a);   
    printf("enter the array of length %d\n",n); 
    for(i=0;i<n;i++)   
        scanf_s("%lf",a+i); 
    return a; 
} 
void swap(int *v,int *u)  //function aid for ex3
{ 
    int temp;  
    temp=*v; 
    *v=*u; 
    *u=temp;  
}   
void bubble_sort(int *a, int n)
{  
    int i,j;   
    for(i=0;i<n-1;i++) 
        for(j=0;j<n-i-1;j++)  
            if(a[j]>a[j+1])    
                swap(&a[j],&a[j+1]); 

}
 int *same_same(int *ar1, int *ar2,int n, int m)
{
    int *c; 
    int i=0,j=0,k=0;
    int min=n;
    if (n>m)
        min=m;
    c=(int *)calloc(min, sizeof(int)); 
    bubble_sort (ar1, n);
    bubble_sort (ar2, m);

while( i<n  &&  j<m ) 
{ 
    if (ar1[i] == ar2[j])
    {
        c[k++]=ar1[i++];
        j++;

    }
    else if (ar1[i] < ar2[j])
        i++;
    else j++;

} 
c=(int *)realloc(k, sizeof(int));
return c;
free (c);
}
int main(void)
{
    int  *arr1 , *arr2 ,n,m; // input for Ex 3
    printf_s("Please Insert Size of array one :\n");
                scanf_s("%d",&n);
                printf_s("Please Insert Size of array two :\n");
                scanf_s("%d",&m);
                printf_s("Please Insert numbers of array one :\n");
                arr1=input_array_dyn(n);
                printf_s("Please Insert numbers of array two :\n");
                arr2=input_array_dyn(m);
                printf_s("The new array is :\n");
                same_same(arr1,arr2,n,m);
                free (arr1);
                free (arr2);

}

1 个答案:

答案 0 :(得分:0)

以下是包含修复程序的版本。调用realloc()并不能保证返回的指针位于同一个地方。根据{{​​3}} “返回值。指向重新分配的内存块的指针,可能与ptr或新位置相同。”

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
#include <assert.h>
#include <string.h>

void swap(int *v,int *u)  //function aid for ex3
{ 
    int temp;  
    temp=*v; 
    *v=*u; 
    *u=temp;  
} 

void bubble_sort(int *a, int n)
{  
    int i,j;
    for(i=0;i<n-1;i++)
        for(j=0;j<n-i-1;j++)
            if(a[j]>a[j+1])    
                swap(&a[j],&a[j+1]);

}

void *same_same(int *ar1, int *ar2,int n, int m, int ** res, int * res_size)
{
    int *c; 
    int i=0,j=0,k=0;
    int min=n;
    if (n>m)
        min=m;
    c=(int *)calloc(min, sizeof(int)); 
    bubble_sort (ar1, n);
    bubble_sort (ar2, m);

    while( i<n  &&  j<m ) 
    { 
        if (ar1[i] == ar2[j])
        {
            c[k++]=ar1[i++];
            j++;

        }
        else if (ar1[i] < ar2[j]){
            i++;}
        else j++;

    }

    // Fixes
    *res_size = k;
    (*res) = (int *) calloc(*res_size, sizeof(int));
    memcpy(*res, c, (*res_size)*sizeof(int));
    free(c);
}

//Example code
int main(void)
{
    int  arr1[] =  {2, 5, 3, 1, 2, 4, 6, 2, 4, 3, 5, 2};
    int  arr2[] = {7, 5, 2, 5, 8, 1, 2, 5, 9, 2}; 
    int n = sizeof(arr1)/sizeof(int);
    int m = sizeof(arr2)/sizeof(int);
    // input for Ex 3
    int *res;
    int res_size;
    same_same(arr1,arr2,n,m, &res, &res_size);
    int i;
    for(i=0; i < res_size; i++)
        printf("%d ", res[i]);
    printf("\n");

    return 0;
}