Lista w C++
Janusz Sobieraj - 28 LO

Implementacja wlasnej listy w C++

Jak juz wspominalem, samemu zaimplementowac liste nie jest trudno, a poza tym to swietne cwiczenie programistyczne. Zalózmy, ze chodzi nam o taka wlasnie strukture jak na rysunku.
struct ciag 
 { 
  int liczba; 
  struct ciag *nast; 
 }; 
 struct ciag *lista; 
 struct ciag *poczatek;

W tej implementacji kazdy obiekt na liscie jest rekurencyjna struktura i musi zawierac dodatkowy element: wskaznik do innego obiektu tego typu. Wynika to z faktu, ze to wskazniki sa podstawa nawigacji w tym typie danych, a dostep do poszczególnych elementów jest mozliwy wylacznie przez wskaznik. Charakterystyczna cecha takich struktur rekurencyjnych jest mozliwosc zmieniania ich rozmiarów.

U nas lista bedzie taka wlasnie dynamiczna struktura, zas poczatek, jak mówi nazwa, jest wskaznikiem na poczatkowy adres tej struktury - umozliwi to pózniejsze operacje, takie jak np dostep do poszczególnych elementów czy zwalnianie pamieci.

W zaleznosci od potrzeb nasza liste bedziemy mogli rozszerzac "do tylu" lub "do przodu". Oto dwie procedury na takie okolicznosci i do "kompletu" procedura tworzaca liste (stos).
I na koniec wypisanie i zwolnienie pamieci po liscie (potraktowanej jako stos)
void na_koniec(int a) 
{
 if(lista==NULL) 
  {
   lista=poczatek; 
   lista->liczba=a;
  } 
   else 
    {
     lista->nast=new ciag; 
     lista=lista->nast; 
     lista->liczba=a;
    }
}
void na_poczatek(int a) 
{ciag *nowy; 
  if(lista==NULL) 
   { 
    lista=poczatek; 
    lista->liczba=a; 
   } 
 else 
  { 
   nowy=new ciag; 
   nowy->nast=poczatek; 
   nowy->liczba=a; 
   poczatek=nowy; 
  } 
}
void tworzenie() 
{int i=1; 
 poczatek=new ciag; 
 na_poczatek(i); 
 //na_koniec(i); 
 while(i<10) 
  { 
    na_poczatek (2*i++); 
    //na_koniec(2*i++); 
  } 
 lista->nast=NULL; 
}
void wypisz() 
{ 
 lista=poczatek; 
 while(lista) 
  { 
   printf("%d,",lista->liczba); 
   lista=lista->nast; 
  } 
  printf("\r\n"); 
}
void done()
{ 
  struct ciag *pom; 
  lista=poczatek; 
  while(lista) 
    { 
      pom=lista; 
      lista=lista->nast; 
      free(pom); 
    } 
}