Для начала эти элементы данных
node* temp;
node* curr;
являются избыточными. Вместо них вы можете использовать аналогичные локальные переменные в функциях-членах класса, если это необходимо.
Функция addNode
имеет дело с локальной переменной head
вместо члена данных с тем же именем.
void List::addNode(string digits)
{
int o = 1;
int j = 0;
int i = 0;
node *n;
node *head;
//…
Также вы забыли установить для элемента данных рядом с последним узлом значение nullptr
.
Если функция-член будет вызвана во второй раз, произойдет утечка памяти.
Вызов стандартной функции std::stoi
для одного символа
n->data = stoi(digits.substr(i,1));
неэффективен.
Класс может выглядеть следующим образом, как показано в демонстрационной программе ниже. Вам нужно будет самостоятельно добавить другие необходимые функции-члены (например, конструктор копирования или деструктор).
#include <iostream>
#include <string>
class List
{
private:
struct node
{
int data;
node *next;
} *head = nullptr;
public:
List() = default;
void addNode( const std::string &digits );
std::ostream & printList( std::ostream &os = std::cout ) const;
};
void List::addNode( const std::string &digits )
{
if ( !digits.empty() &&
!( digits.size() == 1 && ( digits[0] == '-' || digits[0] == '+') ) )
{
node **current = &head;
while ( *current )
{
node *tmp = *current;
*current = ( *current )->next;
delete tmp;
}
std::string::size_type i = 0;
*current = new node { digits[i] == '-' ? -1 : 1, nullptr };
if ( digits[i] == '-' || digits[i] == '+' ) ++i;
for ( ; i < digits.size(); i++ )
{
current = &( *current )->next;
*current = new node { digits[i] - '0', nullptr };
}
}
}
std::ostream & List::printList( std::ostream &os ) const
{
if ( head != nullptr )
{
if ( head->data == -1 ) os << '-';
for ( node *current = head->next; current != nullptr; current = current->next )
{
os << current->data;
}
}
return os;
}
int main()
{
List lst;
lst.addNode( "-123456789" );
lst.printList() << '\n';
lst.addNode( "987654321" );
lst.printList() << '\n';
return 0;
}
Вывод программы:
-123456789
987654321