Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何从使用动态分配创建的数组中删除所有重复项?_C_Arrays - Fatal编程技术网

C 如何从使用动态分配创建的数组中删除所有重复项?

C 如何从使用动态分配创建的数组中删除所有重复项?,c,arrays,C,Arrays,我编写了一个程序,动态分配一个新数组,该数组包含来自另外两个数组的元素。 但是,该程序并没有从新阵列中完全删除所有副本。它不是输出12345,而是输出1233。我试图通过首先对数组进行排序来解决这个问题,但是这一点都没有帮助 int koko(int va, int vb, int *kar, int *a, int *b) { int *c; int kar2 = (*kar); c = (int)malloc(kar2 * sizeof(int)); int

我编写了一个程序,动态分配一个新数组,该数组包含来自另外两个数组的元素。 但是,该程序并没有从新阵列中完全删除所有副本。它不是输出
12345
,而是输出
1233
。我试图通过首先对数组进行排序来解决这个问题,但是这一点都没有帮助

int koko(int va, int vb, int *kar, int *a, int *b) {
    int *c;
    int kar2 = (*kar);
    c = (int)malloc(kar2 * sizeof(int));
    int i, j, u, temp;

    //takes all elements from the first array
    for (i = 0; i < va; i++) {
        c[i] = a[i];
    }

    //takes all elements from the second array
    for (i = 0, j = va; j < kar2 && i < vb; i++, j++) {
        c[j] = b[i];
    }

    //sorts the array
    for (i = 0; i < kar2; i++) {
        for (j = i + 1; j < kar2; j++) {
            if (c[i] > c[j]) {
                temp = c[i];
                c[i] = c[j];
                c[j] = temp;
            }
        }
    }

    //removes all duplicates(or it should at least)
    for (i = 0; i < kar2; i++) {
        for (j = i; j < kar2; j++) {
            if (c[j] == c[i]) {
                for (u = j; u < kar2; u++) {
                    c[u] = c[u + 1];
                }

                kar2--;
            }
            else {
                j++;
            }
        }
    }

    c = (int)realloc(c, sizeof(int) * kar2);
    (*kar) = kar2;
    return c;
}

int main() {
    int *s;
    int a[] = {1, 2, 3, 3, 3, 3, 5};
    int b[] = {1, 2, 2, 2, 3, 4};
    int va = sizeof(a) / sizeof a[0];
    int vb = sizeof(b) / sizeof b[0];
    int kar = va + vb;
    s = koko(va, vb, &kar, a, b);

    for (int q = 0; q < kar - 1; q++) {
        printf("%d\t", s[q]);
    }

    free(s);
}
intkoko(intva,intvb,intkar,inta,intb){
int*c;
int kar2=(*kar);
c=(int)malloc(kar2*sizeof(int));
内部i、j、u、温度;
//从第一个数组中获取所有元素
对于(i=0;ic[j]){
温度=c[i];
c[i]=c[j];
c[j]=温度;
}
}
}
//删除所有重复项(或至少应删除)
对于(i=0;i
这是我写的代码。有人看到问题出在哪里了吗?

//出现了一些1对1的错误:
    // there were a few off-by-1 errors:
    // loops were accessing 1 element beyond the array (fixed with kar2 - 1)
    // after moving array elements, the current element wasn't being
    // re-tested with its new neighbor (fixed with i--)

    // remove duplicates
    for (i = 0; i < (kar2 - 1); i++) {
        // different, move onto the next pair
        if (c[i] != c[i + 1])
            continue;

        // duplicate, move array elements back by 1
        for (j = i + 1; j < (kar2 - 1); j++)
            c[j] = c[j + 1];

        // account for duplicate
        kar2--;

        // after the second loop, new next element could be another duplicate;
        // need to re-test the current element with the new next element
        i--;
    }
//循环正在访问数组之外的1个元素(用kar2-1修复) //移动数组元素后,当前元素未被删除 //使用新邻居重新测试(使用i-)修复) //删除重复项 对于(i=0;i<(kar2-1);i++){ //不同,换上下一对 如果(c[i]!=c[i+1]) 持续 //重复,将数组元素向后移动1 对于(j=i+1;j<(kar2-1);j++) c[j]=c[j+1]; //帐目重复 kar2--; //在第二个循环之后,新的下一个元素可能是另一个副本; //需要使用新的下一个元素重新测试当前元素 我--; }
sizeof(int)):你继续施放
c=(int)malloc(kar2*sizeof(int))除了演员外,应该是
(int*)
而不是
(int)
。如果
int*
指针是64位的,而
int
指针是32位的,这就行不通了。@ile123两个源数组排序了吗?在编程中有三件事很难做对:命名和避免一个错误。@VladFrommosco不,我的程序只对新创建的数组排序(在本例中,数组称为c)