Добавяне на елемент в края на списъка
Нека с back
обозначим указател от типа Node*
, който е насочен към последният елемент на списъка.
1 | Node* back=head_->prev_; |
Добавянето на елемент в края на списъка означава, че трябва да вмъкнем елемент между елемента back
и head_
.
За добавяне на нов елемент в списъка дефинираме член-функция push_back()
на класа List
. За удобство функцията дефинира локална променлива back
, която е насочена към последният елемент от списъка. След това динамично се заделя памет за нов елемент на списъка, към който се насочва указателят ptr
. Така създаденият елемент трябва да се разположи между елементите, към които са насочени указателите back
и head_
.
Елементът ptr
трябва да бъде след елемента back
. Следователно:
1 2 | back->next_=ptr; ptr->prev_=back; |
Елементът ptr
трябва да бъде преди елемента back
. Следователно:
1 2 | ptr->next_=back; back->prev_=ptr; |
Комбинирайки тези фрагменти от код получаваме целият метод push_back()
.
1 2 3 4 5 6 7 8 9 10 11 12 13 | ... void push_back( int val) { Node* back=head_->prev_; Node* ptr= new Node(val); back->next_=ptr; ptr->prev_=back; head_->prev_=ptr; ptr->next_=head_; } ... |
[note]Обърнете внимание, че дефинираната по този начин член-функция е коректна и в случая на празен списък. Ако сисъкът е празен, то променливата back
ще бъде насочена към водещията елемент back==head_
. Това означава, че при добавянето на елемент в празен списък, кодът който ще се изпълни, ще бъде еквивалентен на следното:
1 2 3 4 5 | head_->next_=ptr; ptr->prev_=head_; head_->prev_=ptr; ptr->next_=head_; |
което е точно необходимият код за добавяне на елемент в празен списък.[/note]