Strona 1 z 1

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

: 7 sty 2013, o 13:46
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);
}

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

: 7 sty 2013, o 14:33
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.