Ilosc unikatowych wartosci

19Radek88
Użytkownik
Użytkownik
Posty: 105
Rejestracja: 2 lis 2007, o 21:01
Płeć: Mężczyzna
Lokalizacja: Łódź
Podziękował: 14 razy
Pomógł: 4 razy

Ilosc unikatowych wartosci

Post autor: 19Radek88 »

Hej.
Czy mogłby mi ktoś napisać w C samą funkcję zwracającą liczbę unikatowych elementów tablicy np. int'ów w możliwie najkrótszy i możliwie prosty sposób. Czy należy tworzyć zawsze tablicę pamiętającą dotychczasowe elementy?
soku11
Użytkownik
Użytkownik
Posty: 6607
Rejestracja: 16 sty 2007, o 19:42
Płeć: Mężczyzna
Podziękował: 119 razy
Pomógł: 1823 razy

Ilosc unikatowych wartosci

Post autor: soku11 »

Kod: Zaznacz cały

int unique( int *tab, int range )
{
  int i,j,found;
  int fill=1;
  int *tmp=malloc( range*siezof(int) );
  tmp[0]=tab[0];
  
  for( i=1;i<range;++i )
  {
    found=0;
    for( j=0;j<fill;++j )
      if( tab[i]==tmp[j] )
      {
        found=1;
        break;
      }
    if( !found )
       tmp[fill++]=tab[i];
  }

  free(tmp);
  return fill;
}
Powinno dzialac POZDRO
19Radek88
Użytkownik
Użytkownik
Posty: 105
Rejestracja: 2 lis 2007, o 21:01
Płeć: Mężczyzna
Lokalizacja: Łódź
Podziękował: 14 razy
Pomógł: 4 razy

Ilosc unikatowych wartosci

Post autor: 19Radek88 »

... ale czy moglbybm jeszcze prosic o napisanie funkcji tak aby zwracala tablice takie wartosci unikatowych?
soku11
Użytkownik
Użytkownik
Posty: 6607
Rejestracja: 16 sty 2007, o 19:42
Płeć: Mężczyzna
Podziękował: 119 razy
Pomógł: 1823 razy

Ilosc unikatowych wartosci

Post autor: soku11 »

Tablicy jako tako nie mozna zwracac. Co najwyzej mozna zrobic przekazywanie jej przez wskaznik jako argument funkcji:

Kod: Zaznacz cały

int unique( int *tab, int range, int *out )
{
  int i,j,found;
  int fill=1;
  if( out ) free( out );
  out=malloc( range*siezof(int) );
  out[0]=tab[0];
 
  for( i=1;i<range;++i )
  {
    found=0;
    for( j=0;j<fill;++j )
      if( tab[i]==out[j] )
      {
        found=1;
        break;
      }
    if( !found )
       out[fill++]=tab[i];
  }

  free( out );
  return fill;
} 
Dajesz mu wskaznik na tablice, jej rozmiar oraz wskaznik na ta z unikatami. Jesli druga istnieje to ja kasuje i tworzy od nowa w maksymalnych rozmiarach. Pozniej jest zapelniana przez wartosci. Mozna to zrobic przez dynamiczna allokacje i wtedy nie bedzie marnotrawstwa pamieci, no ale zostawiam tak POZDRO
ODPOWIEDZ