[C++] lista jednokierunkowa, przesunięcie co drugiego elemen

anilahcim
Użytkownik
Użytkownik
Posty: 209
Rejestracja: 13 lip 2012, o 14:32
Płeć: Kobieta
Lokalizacja: Pcim
Podziękował: 107 razy

[C++] lista jednokierunkowa, przesunięcie co drugiego elemen

Post autor: anilahcim »

Mam pytanie co do 26. linijki; po co jest warunek "koniec != starykoniec"? Czy nie jest tak, że najpierw koniec=starykoniec, a potem przechodzi dalej, czyli i tak już nie będzie spełniona równość koniec = starykoniec?

Kod: Zaznacz cały

void przesunco2a(wezel* pocz)
{
   // przesunięcie co drugiego w kolejnoci elementu na koniec listy, z zachowaniem ich pierwotnej względnej kolejnoci
   // umowa: zaczynamy od II elementu
   // pocz zatem nie przekazujemy przez referencję, bo głowa się nie zmieni

   if (pocz == NULL || pocz->nast == NULL || pocz->nast->nast == NULL)
      return; // nie ma nic do roboty
   
   wezel* koniec = pocz; // znajdĽ ogon listy - tam będziemy wstawiać
   while (koniec->nast != NULL)
      koniec = koniec->nast;

   wezel* starykoniec = koniec; // zapamiętaj, gdzie był koniec, by wiedzieć, gdzie skończyć
   do // na pewno raz musimy co przestawić
   {
      // pocz->nast przenosimy na koniec
      koniec->nast = pocz->nast;

      pocz->nast = pocz->nast->nast; // wskaż nie na następny, ale na po-następny
      pocz = pocz->nast; // idĽ dalej

      koniec = koniec->nast; // teraz tu jest koniec
      koniec->nast = NULL;
   }
   while (pocz != starykoniec && koniec != starykoniec);
}
royas
Użytkownik
Użytkownik
Posty: 363
Rejestracja: 24 sie 2012, o 09:27
Płeć: Mężczyzna
Lokalizacja: Cieszyn
Pomógł: 80 razy

[C++] lista jednokierunkowa, przesunięcie co drugiego elemen

Post autor: royas »

Jeśli lista ma parzystą liczbę elementów, to ostatni krok to będzie właśnie przeniesienie pierwotnego ostatniego elementu znów na koniec, wtedy pętla poprawnie zakończy się właśnie dzięki temu warunkowi, bo pocz!=starykoniec nie zadziała gdyż pocz będzie już wskazywał na przeniesiony pierwotnie drugi element.
ODPOWIEDZ