我们如何删除C中数组中的重复元素?

问题描述 投票:1回答:2

我是C语言的初学者,正在努力删除C语言数组中重复的元素

我可以过滤掉该元素,但是最后该元素的位置将仅被0替换,并且不会消失

这里是代码:

#include <stdio.h>

int main()
{
    int arr[6] = {1,2,3,3,8,5};
    int newArr[6] = {};
    int temp,i,j;

    for(i = 0; i < 6; i++){
        for(j = i+1; j <= 6; j++){
            if(arr[i] != arr[j]){
                newArr[i] = arr[i]; 
                break;
            }else{
                continue;
            }
        }
        temp = j;
        i = temp-1;
    }

    for(int k = 0; k < 6; k++){
        printf("%d,", newArr[k]);
    }

    return 0;
}

结果是:1,2,3,0,8,5

预期结果:1,2,3,8,5

请帮助

c arrays memory-management
2个回答
0
投票

这是我的解决方案。无需创建新数组

#include <stdio.h>

int main()
{
    int arr[6] = {1,2,3,3,8,5};
    int temp,i,j, size = 6;

    for(i = 0; i < size; i++){

        for(j = i+1; j < size; j++){

            if(arr[i] == arr[j]){
                for(int k = j; k < size; k++){
                    arr[k] = arr[k+1];   
                }
                size--;
                j--;

            }    
        }
    }

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

    return 0;
}

感谢所有帮助


0
投票

您的代码是错误的,因为for(j = i+1; j <= 6; j++)在某一时刻指向甚至不存在的第7个元素。

现在是要使用的算法/方法:

  1. 首先对数组进行排序(您选择了数组作为示例arr,这可能会误导您。
  2. 遍历数组并查找更改。

使用某种排序机制(例如合并排序或快速排序进行排序,这是排序数组中的更改检测机制,其中重复元素将被标记为0

 int index=0;
 int change_detector = INT_MAX; //a macro - google it             
 unsigned int siz = sizeof(arr)/sizeof(arr[0]); //arr represents sorted array

 for(;index<siz;index++)
 {
    if(arr[index] != change_detector)
    {
      change_detector = arr[index];
    }
    else
    {
      arr[index]=0;          //marking the duplicate element as 0
    }
 }
 //print the array to check the result
© www.soinside.com 2019 - 2024. All rights reserved.