2012-03-24 2 views
1

Я пытаюсь создать программу на C, которая удаляет повторяющиеся значения в целочисленном массиве. Моя стратегия состоит в том, чтобы сначала отсортировать массив с помощью функции selectionsort, а затем вызвать функцию removeup, которая удаляет любые последовательные, повторяющиеся значения в массиве.удаление повторяющихся значений из массива в C

Мой код:

#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) Как исправить ошибку компилятор в предоставлении мне в главном корпусе при вызове removedup внутри PrintArray функции, говоря " неверное преобразование из int в int * "? (строка 22)

2) Как точно определить размер OutArray [] в функции removeup? В настоящее время я определяю его как переменную размера, но значение этой переменной точно не определено до объявления OutArray.

+0

Вы можете сделать это быстрее в O (n), кстати – BlackBear

+0

Прочтите [comp.lang.c FAQ] (http://c-faq.com/), начиная с раздела 6. – pmg

ответ

1

Обратите внимание ваши прототипы ...

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

А также заметить, что вы звоните printArray() с результатом removedup().

 printArray(removedup(a)); 

Результат removedup() is int; printarray() требует int [].
int и int [] несовместимы.

Предлагаю удалить дубликаты и печатать массив в двух разных операциях.

+0

Хорошо, это делает смысл. Однако я не знаком с массивами как с типом данных. Могу ли я изменить прототип для чтения «int [] removedup (int a [])»? – Joshpho

+0

Нет, в принципе вы не можете возвращать массивы из функций.Сделайте функцию 'removedup()' изменением входного массива или отправьте ему выходной массив. Затем в другом выражении напечатайте измененный массив. – pmg

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 ожидает, что элементы будут отсортированы! Я заметил, что вы используете свою собственную реализацию сортировки, что заставляет меня думать, что это домашнее задание. В этом случае я немного неохотно даю вам полное решение, хотя понимание этого должно быть хорошим упражнением в любом случае.

EDIT: Я должен был объяснить последнюю строку кода.

return size ? curr+1 : 0; эквивалентно:

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

Просто короткий способ сказать то же самое.

+0

Спасибо за вашу помощь, и это имеет смысл по большей части - хотя вы могли бы объяснить, какой размер возврата? curr + 1: 0; означает? Я не совсем знаком с обозначениями. – Joshpho

+0

Я отредактировал свой ответ, потому что у других людей может быть такой же вопрос в будущем. Надеюсь, поможет. Если это вам помогло, вы должны принять мой ответ =) – Mig