Implementacja listy

1

Próbuje zaimplementować listę, tylko nieskutecznie.
Znalazłem coś takiego http://cpw.net.pl/c++/artyku%C5%82/275/
ale nie wiem czym są te podwójne gwizdki i jak one działają.

0

Dwie gwiazdeczki to wskaźnik na wskaźnik.

Implementacja prostej listy w C/C++ jest bajecznie prosta :D

0

gdy mamy jakaś listę zazwyczaj trzymamy wskaźnik na jej pierwszy element, żeby móc na niej pracować. gdy w wyniku działania jakiejś funkcji zmieni się pierwszy element, to musi się zmienić zmienna, która wskazuje na pierwszy element. dlatego przekazujemy ją nie jako wskaźnik, ale wskaźnik na wskaźnik, dzięki czemu możemy zmodyfikować jej wartość wewnątrz funkcji. analogicznie jak gdy w przykładzie:

typedef int typ;
void func(typ *a) {
  *a = 2;
}
int main(void) {
  typ a=5;
  func(&a); // ta funkcja zmodyfikuje nam wartość zmiennej a, bo przekazaliśmy ją jako wskaźnik
}

podwójne ** może się wydawać dziwne, ale najprościej to sobie wyobrazić w ten sposób. w powyższym przykładzie zmienna jest typu int, więc przekazujemy wskaźnik na int. w liście zmienna jest wskaźnikiem na strukturę, zatem przekazujemy wskaźnik na wskaźnik na strukturę. można by przekazać "zwyczajny" wskaźnik na strukturę, ale należało by potem zwrócić nowy element początkowy, analogicznie:

typ func(typ a) {
  a = 2;
  return a;
}
int main(void) {
  typ a=5;
  a = func(a); //ważne - musi być przypisanie
}

tak jak pisałem, typ możemy zdefiniować jako:

typedef struktura* typ;
0

Dzięki! Cyba zrozumiałem. Udało mi się napisać prosty program oparty na liście.
Nie rozumiem jeszcze tylko jednej rzeczy. Jak wygląda implementacja listy z wartownikiem.
Bardzo bym prosił jak prosty przykład z wyjaśnieniem.

0

Czyli w liście bez wartownika w ostatnim elemencie pole next=NULL, a w przypadku listy z wartownikiem pole next będzie wskazywało na następny element który ma wartość NULL
Dobrze rozumiem??

Jeśli tak to czy takie wartownik deklaruje np. jako wskaźnik ?? np. int * wartownik = NULL

I czy w przypadku listy dwukierunkowej tworze dodatkowa strukturę wartownika zawierającą adresu głowy i ogona,
gdzie ostań element będzie wskazywał na głowę w strukturze wartownika, a pierwszy na ogon,
przez otrzymam listę cykliczną?

0

OK. Czyli wartownika nie deklarujemy.
Ale skoro w ostatnim elemencie next=NULL jest wartownikiem to lista zawsze będzie mieć wartownik
A jak to sie ma w liście dwukierunkowej. Poprzez wartownik powinna być cykliczna
głowa pole prev=NULL, ogon pole next=NULL.
To otrzymam listę cykliczną??

0

Tak by wyglądało wstawienie na koniec listy jednokierunkowej z wartownikiem??

Utwórz nowy element 	 
e = adres nowego elementu 	 
e→next = NULL
e→data = jakaś dana 	 
p = head
jeśli p != NULL
       while (p→next) ≠ NULL
                 wykonuj p = (p→next) 
       (p→next) = e 
       Zakończ 
esle	 
       head = e 	
Zakończ 

1 użytkowników online, w tym zalogowanych: 0, gości: 1