Почему моя функция печати не работает? Связанный список - PullRequest
0 голосов
/ 08 января 2020

Я выполняю задание класса, где мне нужно создать связанный список, представляющий большое число, но я не могу заставить работать функцию печати. ​​

Это код:

Заголовок

class List
{
private:
    struct node
    {
        int data;
        node* next;
    };
    node* head;
    node* temp;
    node* curr;
public: 
    List();
    void addNode(std::string digits);
    void printList();
};

Конструктор

List::List()
{
    head = NULL;
    curr = NULL;
    temp = NULL;
}

Функция, которая создает список

void List::addNode(string digits)
{
    int o = 1;
    int j = 0;
    int i = 0;
    node *n;
    node *head;
    node *temp;
    //=================================================================================//
    n = new node;
    if (digits[0]=='-')
    {
        n -> data = -1;
        head = n;
        temp = n;
    }
    else
    {
        n -> data = 1;
        head = n;
        temp = n;
    }
    //================================================================================//
    if ((head->data) == -1)
    {
        while (o < digits.length())
        {
            n = new node;
            n->data = stoi(digits.substr(o,1));
            temp -> next = n;
            temp = temp -> next;
            o++;
        }
    }
    else
    {
        while(i < digits.length())
        {
            n = new node;
            n->data = stoi(digits.substr(i,1));
            temp -> next = n;
            temp = temp -> next;
            i++;
        }
    }

Функция печати, которую я пытался реализовать, не дает вывода ( пусто):

void List::printList()
{
    node* curr = head;
    while(curr != NULL)
    {
        cout<<curr -> data<<" ";
        curr = curr -> next;
    }
}

При использовании этого кода в функции addNode список печатается нормально:

if ((head -> data) == -1)
{
    while(j < digits.length())
    {
        cout<<head -> data<<" ";
        head = head -> next;
        j++;
    }
}
else
{
    while(j<=digits.length())
    {
        cout<<head -> data<<" ";
        head = head -> next;
        j++;
    }
}

1 Ответ

2 голосов
/ 08 января 2020

Для начала эти элементы данных

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
...