Choć algorytm jest poprawny można by go jeszcze nico ulepszyć.
soku11 pisze:WITAM!
Mam funkcje, ktora powinna kasowac powielone elementy w tablicy tab[size] i uzupelnic ja od nowa samymi cyframi nie powtarzajacymi sie i zmienic ej rozmiar na wymagany (size).
Rozumiem, że przyjąłeś założenie że w tablicy nie mogą wystapić zera, bo jeżeli tak, wtedy program może nie działać do końca poprawnie, bo za kryterium końca tablicy przyjałeś wartość 0;
Kolejny problem to przypadek gdy oryginalna tablica zawiera komplet różnych liczb wtedy pętla
while(return_tab[new_size])new_size++;
może wyjść poza zakres tablicy.
Można spróbować
Znaleźć najmnieszy element tablicy wejściowej element_min i wpisać go tablicawyjściowa[0]
W pętli while (lub for) znajdywać kolejne elementy tablicy wejściowej większe od element_min
i podstwić je pod element_min wpisując jednocześnie do tablicawyjściowa[i++]
Warunkeim końca pętli jest brak w niej elementu większego od aktualnej wrtości element_min.
Na zakończenie tak jak miałeś przepisujesz tablicawyjściowa do tablicawejściowa, a *size = i
Przykładowy kod
Kod: Zaznacz cały
#include <stdio.h>
typedef unsigned int uint;
void remove_dup(uint tab[], uint *size) {
uint return_tab[*size];
uint i, imin = tab[0], imax = tab[0], imm;
uint new_size = 0;
if (*size < 2) return;
/* Szukamuy najmniejszego i największego elementu */
for(i = 1; i < *size; i++) {
if (tab[i] < imin)
imin = tab[i];
if (tab[i] > imax)
imax = tab[i];
}
/* Podstawiamy wartość pierwszego elementu */
return_tab[new_size++] = imin;
/* Dodajemy kolejne elementy do tablicy tymczasowej return_tab */
while (imin < imax) {
imm = imax;
for(i = 0; i < *size; i++)
if ((tab[i] > imin) && (tab[i] < imm))
imm = tab[i];
imin = imm;
return_tab[new_size++] = imin;
}
/* Ustalenie nowego rozmiaru */
*size = new_size;
/* Przepisanie zawartości */
for(i = 0; i < *size; i++)
tab[i] = return_tab[i];
return;
}
int main() {
uint tab[] = {1,2,3,3,5,5,7,7,7,10,11,0,12,13};
uint i, size = sizeof(tab) / sizeof(int);
for (i = 0; i < size; i++)
printf("%i ", tab[i]);
puts("");
remove_dup(tab, &size);
for (i = 0; i < size; i++)
printf("%i ", tab[i]);
puts("");
return 0;
}