用 C++ 制作一个简单的链表

Posted

技术标签:

【中文标题】用 C++ 制作一个简单的链表【英文标题】:Making a simple linked list in C++ 【发布时间】:2015-02-01 04:19:42 【问题描述】:
struct Node
    string val;
    Node* next;
;

Node* makeList ()

    string current;
    Node* n;
    Node* head= NULL;
    Node* temp = n;

    while(cin>>current && !cin.fail())
    
        n = new Node;
        n->val = current;
        temp ->next = n;
        temp = temp -> next;
    
    n->next = NULL;

    return n;

我正在尝试了解链表,这个函数 makeList() 应该使用来自字符串列表的输入来创建和返回链表。老实说,我有点迷路了。任何帮助将不胜感激。

【问题讨论】:

【参考方案1】:

首先,您要返回链表的最后一个节点。我认为您应该返回头部并将其分配给第一个节点。

其次,您将 cin.fail() 用于我认为不应执行的字符串。如果数据不匹配,cin.fail() 将起作用,而对于字符串,我认为这种情况很少见。

函数看起来有点像:

Node* makeList ()

    string current;
    Node* n;
    Node* head= NULL;
    Node* temp = n;

    while(cin>>current && !cin.fail())
    
        if(current == "0")
            break;
        n = new Node;
        n->val = current;
        temp ->next = n;
        temp = temp -> next;
        if(!head)
            head = n;
    
    n->next = NULL;

    return head;

【讨论】:

【参考方案2】:

首先,由于您的temp 代表最后一个元素,我将在开头将其设置为NULL(nullptr 更符合C++ 的精神,因此我将在后面的文本中使用它)。 之后在while循环中,当你添加一个新元素时,你应该写n->next=nullptr,因为新元素的指针next(如果你总是将它添加到列表的后面)将总是指向 nullptr。在您的实现中,您的新元素n 始终指向它自己。稍后在您的while 循环中,您需要检查head==nullptr,如果这是真的,那么您应该将head 分配给您创建的新元素head=n .如果head 不等于nullptr,那么您需要将元素n 添加到后面temp->next=n。在循环的 and 中,您应该将 n 元素分配为 last-temp=n(它必须在 else 块之外,因为它在上述两种情况下都完成了)。

【讨论】:

【参考方案3】:

恐怕最重要的答案有一些错误......

Node *make_link_list_from_input()
    string value;
    Node *head = nullptr;
    Node *current = nullptr;
    Node *last = nullptr;

    while (cin >> value)
        current = new Node();
        if(head== nullptr)
            head = current;
        
        if(last!= nullptr)
            last->next=current;
        
        last=current;
    
    if(last != nullptr) 
        last->next = nullptr;
    
    return head;

【讨论】:

以上是关于用 C++ 制作一个简单的链表的主要内容,如果未能解决你的问题,请参考以下文章

c++链表类模板问题(不要用c语言,用c++)

利用java实现一个简单的链表结构

创建一个非常简单的链表

递归打印类中的链表c ++

c++堆与栈的简单认识

几道简单的链表题