2015-01-08 116 views
-4

我需要從用戶數組中刪除重複的號碼。 和我nedd使用像RemoveDup功能。 我有一個錯誤:「表達式必須有指向對象類型的指針」 我看着較舊的forims,並沒有succseed解決問題。你能幫我嗎?如何刪除重複的號碼

#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++; 
     } 
    } 
} 
+0

,開始時,更改代碼[如果編譯器支持VLA]至'INT I,大小; ...的scanf(大小)... INT ARR [大小];'或考慮增加範圍檢查。 –

回答

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; 
} 
+0

似乎最好使用'qsort'進行排序。另外,我認爲它可以在你的排序中刪除重複如果你使用你的排序。 (如果不需要分開排序),那麼您可以減少代碼。 – BLUEPIXY

+0

感謝大家的幫助。我嘗試了你的建議和工作!非常感謝。順便提一下,非複製數組使用隨機數填充過濾器後丟失的最後部分很簡單。 – elad

1

RemoveDup()函數有一個參數int arr這應該是int *arr。它還定義了應該刪除的本地int arr[size]

請注意,對size的更改不會被調用者注意到,您必須返回新的大小(或者指向調用者的大小)。

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; 
} 

輸出爲大家 我用bluepixy solotion

1 2 3 4 5 6 
0

感謝和它的作品只是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() 
 
{ 
 

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

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

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

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

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

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

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