我试图在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声明之后,这个变量的值才准确定义。
答案 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;
说同样的话只是一种较短的方式。