104 Rozdział 5, Struktury danych
dla danego obiektu wykonanie na sobie operacji „dekrementacji”. Obiekt ulegający z pewnych powodów destrukcji (ty powe przypadki zostały wzmiankowane wcześniej) wywoła swój destruktor, któiy zaaplikuje na sobie tyle razy funkcję dekrementacji. aby całkowicie zwolnić pamięć wcześniej przydzielona liście
Kolejna porcja kodu do omówienia dotyczy redefinicji operatora + (plus). Naszym celem jest zbudowanie takiej funkcji, która umożliwi dodawanie list w jak najbardziej dosłownym znaczeniu tego słowa. Chcemy, aby w wyniku następujących instrukcji:
LISTA x,y,z; II tworzymy 3 puste listy.
x. dorzuc2(3); x.dorzuc2(2); x.dorzuc2(1);
y. dorzuc2(6; y.dorzuc2(S); y.dorzuc2(4); z=x+y;
... lista wynikowa z zawierała wszystkie elementy list x i y, tzn.: /. 2, .1, 4, .5 i 6 (posortowane!). Najprostszą metodą jest przekopiowanie wszystkich elementów z list .v i y do listy z, aktywując na rzecz tej ostatniej metodę dorzuc2. Zapewni to utworzenie listy już posortowanej:
LI3TA& operator + (LISTA Sx, LISTA <ćy)
(
LISTA *temp=new LISTA;
ELEMENT *ql=(x.Inf).głowa; // wskaźniki robocze ELEMENT łq2=(y.inf).głowa;
while (ql !- NULL) // przekopiowanie listy X do temp (
temp->dorzuc2(ql->wartosc); ql=ql->ńastepriy;
I
while (q2 != NULL) // przekopiowanie listy y do temp I
temp->dorzuc2(q2->warto3c); q2=q2->nastepny;
)
roturn (*temp);
I
Czy jest lo najlepsza metoda? Chyba nie, z uwagi chociażby na niepotrzebne dublowanie danych. Ideałem byłoby posiadanie metody, która wykorzystując fakt, iż listy' są już posortowane”, dokona ich zespolenia ze sobą (tzw. fuzji) używając wyłącznie istniejących komórek pamięci, bez tworzenia nowych. Inaczej mówiąc, będziemy zmuszeni do manipulowania wyłącznie wskaźnikami i to jest jedyne narzędzie, jakie dostaniemy do ręki!
Zakładamy tym samym użycie podczas tworzenia listy metody dorzuci.