Создание LInked List - PullRequest
       21

Создание LInked List

0 голосов
/ 09 июня 2019

Я хочу отобразить строку "Jimmy", но ничего не появляется. В чем моя ошибка?

#include<iostream>
#include<string>

struct Node 
{
    std::string s;
    Node* next;
};
struct  Node* head = NULL;

void insert(const std::string& name) 
{
    struct Node* newnode = (struct Node*)malloc(sizeof(struct Node));
    newnode->s = name;
    newnode->next = NULL;
    head = newnode;
}

void display() 
{
    struct Node* ptr;
    ptr = head;
    while (ptr != NULL) {
        std::cout << ptr->s << std::endl;
    }
}

int main() 
{
    insert("Jimmy");
    display();
    return 0;
}

Нет выводов в этом коде. Пожалуйста, дайте некоторые рекомендации. Я все еще новичок в этой структуре данных.

1 Ответ

0 голосов
/ 09 июня 2019

Стандартная функция C malloc выделяет необработанную память, ничего не зная об объекте, который будет помещен в память.

Так что ни один конструктор объекта не будет вызван.

Узел структуры содержит элемент данных типа std::string, для которого должен быть вызван конструктор.

В C ++ используйте оператор new вместо вызова функции C malloc. Оператор не только выделяет память, но и вызывает конструктор для созданного объекта.

Плохо использовать глобальные объекты в определениях функций, не передавая их через параметры.

Функция display может иметь бесконечный цикл в случае, если head не равен нулевому указателю, поскольку переменная ptr (которая назначается с головой), используемая в цикле, не изменяется.

void display() 
{
    struct Node* ptr;
    ptr = head;
    while (ptr != NULL) {
        std::cout << ptr->s << std::endl;
    }
}

Функция вставки может быть вызвана только один раз

void insert(const std::string& name) 
{
    struct Node* newnode = (struct Node*)malloc(sizeof(struct Node));
    newnode->s = name;
    newnode->next = NULL;
    head = newnode;
}

потому что в противном случае это может привести к утечке памяти

Вы должны освободить узлы перед выходом из программы.

Вот модифицированная ваша программа, которая не имеет недостатков оригинальной программы.

#include <iostream>
#include <string>

struct Node
{
    std::string s;
    Node *next;
};

void insert( Node * &head, const std::string &s )
{
    head = new Node { s, head };
}

std::ostream & display( const Node * head, std::ostream &os = std::cout )
{
    for ( const Node *current = head; current != nullptr; current = current->next )
    {
        os << current->s << '\n';
    }

    return os;
}

void clear( Node * &head )
{
    while ( head )
    {
        Node *tmp = head;
        head = head->next;
        delete tmp;
    }
}

int main() 
{
    Node *head = nullptr;

    insert( head, "Jimmy" );

    display( head );

    clear( head );

    return 0;
}

Его вывод

Jimmy
...