创建Linked列表

时间:2019-06-09 11:27:38

标签: c++ struct linked-list new-operator singly-linked-list

我想显示字符串“ 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 :(得分:0)

标准的C函数malloc分配原始内存,不知道将要放置在内存中的对象。

因此不会调用该对象的构造函数。

结构Node包含类型std::string的数据成员,应为其调用构造函数。

在C ++中,使用运算符new而不是调用C函数malloc。操作员不仅分配内存,还为创建的对象调用构造函数。

在函数定义中使用全局对象而不通过参数传递全局对象是一个坏主意。

display不等于空指针的情况下,函数head可以具有无限循环,因为循环中使用的变量ptr(用head分配)不是改变了。

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