如何去除重复的数字
how to remove duplicate numbers
我需要从用户数组中删除重复的数字。
我需要使用像 RemoveDup 这样的函数。
我有一个错误:"expression must have pointer to object type"
我查看了较旧的 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++;
}
}
}
RemoveDup()
函数有一个参数 int arr
,它应该是 int *arr
。它还定义了一个应该删除的本地 int arr[size]
。
请注意,调用者不会注意到对 size
的更改,您必须 return 新大小(或获取指向调用者大小的指针)。
//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;
}
您的函数声明不正确。而不是
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];
而且你的函数不会return到删除重复项后数组末尾的调用方信息。
我会按以下方式编写函数
#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
谢谢大家
我使用了 bluepixy solotion,它只工作 fine.by 使非重复数组为过滤器后丢失的最后部分填充随机数是否简单?
#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;
}
}
我需要从用户数组中删除重复的数字。 我需要使用像 RemoveDup 这样的函数。 我有一个错误:"expression must have pointer to object type" 我查看了较旧的 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++;
}
}
}
RemoveDup()
函数有一个参数 int arr
,它应该是 int *arr
。它还定义了一个应该删除的本地 int arr[size]
。
请注意,调用者不会注意到对 size
的更改,您必须 return 新大小(或获取指向调用者大小的指针)。
//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;
}
您的函数声明不正确。而不是
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];
而且你的函数不会return到删除重复项后数组末尾的调用方信息。
我会按以下方式编写函数
#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
谢谢大家 我使用了 bluepixy solotion,它只工作 fine.by 使非重复数组为过滤器后丢失的最后部分填充随机数是否简单?
#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;
}
}