如何删除重复的数字

时间:2015-01-08 11:02:52

标签: c arrays duplicates

我需要从用户数组中删除重复的数字。 并且我想使用像RemoveDup这样的函数。 我有一个错误:"表达式必须有指向对象类型的指针" 我查看旧的forims并没有成功解决问题。你能帮帮我吗?

#include <stdio.h>
#include <stdlib.h>
#pragma warning (disable: 4996)

void sortAsending(int arr[], int size);
void swap(int* a, int* b);
void RemoveDup(int, int);

void main()
{

    int arr[10];
    int i, size ;

    printf("please enter size of array: ");
    scanf("%d", &size);

    printf("please enter %d numbers: ", size);
    for (i = 0; i < size; i++)
        scanf("%d", &arr[i]);
    printf("the original array is: ");
    for (i = 0; i < size; i++)
        printf("%d ", arr[i]);
    printf("\n");

    sortAsending(arr, size);
    printf("the sorted array is: ");

    for (i = 0; i < size; i++)
        printf("%d ", arr[i]);
    printf("\n");
}
void swap(int* a, int* b)
{
    int temp = *a;
        *a = *b;
        *b = temp;
}

void sortAsending(int arr[], int size)
{
    int i, j;
    for (i = size - 1; i > 0; i--)
    {
        for (j = 0; j < i; j++)
        {
            if (arr[j]>arr[j + 1])
                swap(&arr[j], &arr[j + 1]);
        }
    }
}
void RemoveDup(int arr, int size)
{
    int arr[size];
    int i, j, k;
    for (i = 0; i < size; i++)
    {
        for (j = i + 1; j < size;)
        {
            if (arr[i] == arr[j])
            {
                for (k = j; k < size; k++)
                    arr[k] = arr[k++];
                size--;
            }
            else
                j++;
        }
    }
}

4 个答案:

答案 0 :(得分:1)

RemoveDup()函数的参数int arr应为int *arr。它还定义了应删除的本地int arr[size]

请注意,调用者不会注意到size的更改,您必须返回新的大小(或指向调用者的大小)。

答案 1 :(得分:0)

//prototype
void RemoveDup(int arr[], int *size);

//Assumes that it is sorted
//call RemoveDup(arr, &size);//size is updated.
void RemoveDup(int arr[], int *size){
    int *d, *s, *endp = arr + *size;
    if(*size == 1)
        return;
    d = s = arr;
    while(++s != endp){
        if(*d != *s){
            *++d = *s;
        }
    }
    *size = d - arr + 1;
}

答案 2 :(得分:0)

您的功能声明不正确。而不是

void RemoveDup(int arr, int size);

应该有

void RemoveDup( int *arr, int size);

void RemoveDup( int arr[], int size);

这两个声明是等效的,并声明相同的函数。

此外,您使用本地数组

而不是作为参数传递给函数的原始数组
void RemoveDup(int arr, int size)
{
    int arr[size];

在删除重复项后,您的函数不会返回到数组末尾的调用者信息。

我会按照以下方式编写函数

#include <stdio.h>

int * RemoveDup( int *a, size_t n )
{
    int *p = a;

    if ( n != 0 )
    {
        int *q;

        while ( ++p != a + n && *p != *( p - 1 ) );

        q = p;

        while ( ++q != a + n )
        {
            if ( *q != *( p - 1 ) ) *p++ = *q;
        }
    }

    return p;
}

int main(void) 
{
    int a[] = { 1, 1, 2, 3, 3, 3, 4, 5, 6, 6 };
    const size_t N = sizeof( a ) / sizeof( *a );
    int *q;

    int *p = RemoveDup( a, N );

    for ( q = a; q != p; ++q ) printf( " %d", *q );
    printf( "\n" );

    return 0;
}

输出

1 2 3 4 5 6

答案 3 :(得分:0)

谢谢大家 我使用bluepixy solotion并且它工作得很好。顺便说一下,非过滤数组是否很容易用过滤后的最后部分的随机数填充自己?

&#13;
&#13;
#include <stdio.h>
#include <stdlib.h>
#pragma warning (disable: 4996)

void sortAsending(int arr[], int size);
void swap(int* a, int* b);
void RemoveDup(int arr[], int *size);

void main()
{

	int arr[10];
	int i, size ;
	
	printf("please enter size of array: ");
	scanf("%d", &size);

	printf("please enter %d numbers: ", size);
	for (i = 0; i < size; i++)
		scanf("%d", &arr[i]);
	printf("the original array is: ");
	for (i = 0; i < size; i++)
		printf("%d ", arr[i]);
	printf("\n");

	sortAsending(arr, size);
	printf("the sorted array is: ");

	for (i = 0; i < size; i++)
		printf("%d ", arr[i]);
	printf("\n");
	RemoveDup(arr, &size);
	printf("the nonduplicated array is: ");

	for (i = 0; i < size; i++)
		printf("%d ", arr[i]);
	printf("\n");

}
void swap(int* a, int* b)
{
	int temp = *a;
		*a = *b;
		*b = temp;
}

void sortAsending(int arr[], int size)
{
	int i, j;
	for (i = size - 1; i > 0; i--)
	{
		for (j = 0; j < i; j++)
		{
			if (arr[j]>arr[j + 1])
				swap(&arr[j], &arr[j + 1]);
		}
	}
}
void RemoveDup(int arr[], int *size)
{
	int *d,*s,*endp=arr+ *size;
	if (*size == 1)
		return;
	d = s = arr;
	while (++s != endp)
	{
		if (*d != *s)
		{
			*++d = *s;
		}
		*size = d - arr + 1;
	}
}
&#13;
&#13;
&#13;