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)