Ваша функция добавления ничего не связывает. Всякий раз, когда вы попадаете в блок else
, trav
равен NULL, и вы устанавливаете его равным новому узлу. Но вы никогда не связываете этот новый узел с предыдущим последним узлом.
Обычно trav
будет иметь имя tail
и будет указывать на последний элемент, чтобы вы могли связать новый элемент с текущим последним элементом.
Что-то вроде:
if(this->head==NULL && this->trav==NULL){
cout<<"inside the if block"<<endl;
this->head = new Node(data);
this->trav = this->head;
}
else{
cout <<"inside the else block"<<endl;
this->trav->next = new Node(data);
this->trav = this->trav->next;
}
Редактировать
ОП отметил, что trav
это не , рассматриваемый как хвостовой указатель, а просто указатель для обхода списка.
Таким образом, ответ будет другим, так как код должен найти текущий хвост, используя цикл.
Что-то вроде:
if(this->head==NULL){
cout<<"inside the if block"<<endl;
this->head = new Node(data);
}
else{
cout <<"inside the else block"<<endl;
this->trav = this->head;
while(this->trav->next)
{
this->trav = this->trav->next;
}
this->trav->next = new Node(data);
}
Однако, обратите внимание:
Если trav
является «просто» указателем для обхода списка, нет никакой реальной цели сделать его членом List
. Просто используйте локальную переменную внутри функций, которые должны пройти по списку.
Поскольку ваш код добавляет новые элементы в конец списка, часто очень полезно иметь указатель tail
в качестве члена в List
. Особенно, если список может содержать много элементов, и вы часто добавляете новые элементы.
Ваш код используется this->some_member
во многих местах, где он не нужен. Избегайте этого, чтобы ваш код было легче читать.