Как вы уже догадались, find
пытается найти Snode
, содержащий требуемый символ.Если требуется только это, вы можете игнорировать параметр previous
(это будет NULL), и обработка previous
/ prev
будет просто бесполезной.
Но find
используется в remove
... Чтобы удалить узел в односвязном списке, необходимо, чтобы предыдущий указывал на следующий.Таким образом, вы должны просмотреть список , отслеживая предыдущий узел .Именно так оно и используется в remove
с:
if (previous)
previous->next = temp->next;
Оператор присваивания использует закрытый вариант идиомы копирования и обмена .Но поскольку деструктор использует только элемент head
, только этот элемент заменяется: этого будет достаточно, чтобы иметь деструктор temp
для уничтожения всех узлов исходного списка.
Просто tail
следуетустановить в this
, даже если его бесполезно устанавливать в tmp
.Правильная реализация может быть:
set& operator=( set &rhs)
{
if (&rhs != this)
{
set temp(rhs);
Snode *ptr = head;
head = temp.head;
temp.head = ptr;
tail = temp.tail; // no need for a full swap here
}
return *this;
}