从C中删除数组中的重复值

时间:2012-03-24 18:16:15

标签: c arrays

我试图在C中创建一个程序,删除整数数组中的重复值。我的策略是首先通过selectionsort函数对数组进行排序,然后调用函数removedup来删除数组中任何连续的重复值。

我的代码:

#include <stdio.h>
#include "simpio.h"

#define n 10

void GetArray(int a[]);
void SelectionSort(int a[]);
int FindMax(int a[], int high);
void swap(int a[], int p1, int p2);
int removedup(int a[]);
void printArray(int a[]);

main()
{
      int a[n];
      GetArray(a);
      SelectionSort(a);
      printf("The original, sorted array is\n");
      printArray(a);
      printf("The array with removed duplicates \n");
      printArray(removedup(a));
      getchar();
}


void GetArray(int a[])
{
     int i;
     for(i=0;i<n;i++)
     {
       printf("Enter integer# %d", i+1);
       a[i]=GetInteger();
     }
}

void SelectionSort(int a[])
{
     int i, max;
     for(i=0;i<n;i++)
     {
           max=FindMax(a,n-i-1);
           swap(a,max,n-i-1);
     }     
}

int FindMax(int a[], int high)
{
    int i, index;
    index=high;
    for(i=0;i<high;i++)
    {
       if(a[i]>a[index])
          index=i;
    }
    return index;
}
void swap(int a[], int p1, int p2)
{
     int temp;
     temp=a[p2];
     a[p2]=a[p1];
     a[p1]=temp;
}

int removedup(int a[])
{
     int i, count, OutArray[count], j;
     count=0;
     for(i=0;i<n-1;i++)
     {
                        if(a[i]==a[i+1])
                        {
                                        a[i+1]=a[i+2];
                                        count++;
                        }
     }
     count++;
     for(j=0;j<count;j++)
     {
                       OutArray[i]=a[i];
     }

     return OutArray;                            
}

我有两个问题:

1)当在printarray函数中调用removedup时,如何修复编译器在主体中给出的错误,说&#34;无效转换从int到int *&#34;? (第22行)

2)如何在removedup函数中准确定义OutArray []的大小?目前我把它定义为大小变量,但是在OutArray声明之后,这个变量的值才准确定义。

2 个答案:

答案 0 :(得分:1)

注意你的原型......

int removedup(int a[]);
void printArray(int a[]);

另请注意,您使用printArray()的结果来调用removedup()

      printArray(removedup(a));

removedup()的结果是int; printarray()需要int []。
int和int []不兼容。

我建议你删除重复项并在两个不同的语句中打印数组。

答案 1 :(得分:1)

在数组和指针上阅读comp.lang-c FAQ之后,您应该能够解决编译问题。

对阵列进行排序后,可以使用以下函数删除重复项:

int dedup(int arr[], int size) {
    int curr = 0, next = 0;
    while (next < size) {
        while (next < size && arr[next] == arr[curr])
            next++;
    if (next < size)
      arr[++curr] = arr[next++];
    }
    return size ? curr+1 : 0;
}

它需要两个参数,即数组及其大小。就地删除重复项,这意味着修改了数组,而没有分配新数组来存储唯一元素。

请记住,dedup函数需要对元素进行排序!我注意到你正在使用自己的选择排序实现,这让我觉得这是功课。在这种情况下,我觉得有点不愿意给你一个完整的解决方案,尽管理解它应该是一个很好的练习。

编辑:我应该解释最后一行代码。

return size ? curr+1 : 0;相当于:

if (size) 
    return curr+1;
else
    return 0;

说同样的话只是一种较短的方式。