获取用户输入以形成链表

时间:2018-03-20 03:30:42

标签: c++ linked-list

我正在尝试从用户输入创建一个链接列表,但是当我尝试打印它时它不会打印任何内容。甚至不是头脑。另请注意,它是故意向后的。

这是我获取用户输入的函数,它返回列表。我知道这是错的,但是我已经花了好几个小时就无法让它工作......

#include <iostream>
#include <limits>
#include <ios>

struct Node {
    int value;
    Node *next;
}

Node* getInput() {
    Node* head = nullptr;
    Node* tmp;
    while (true) {  
        int x;
        if (!(cin >> x)) {
            break;
        } else if ( head == nullptr) {
            head = new Node{x, nullptr);
        } else {
            tmp = new Node{x , nullptr};
            tmp->next = head;
            head = head->next;
        }   
    }
    return tmp;
}

int main() {
    cout << getInput()->value;
}

4 个答案:

答案 0 :(得分:1)

get input()的返回值不是列表的实际开头/开头。插入任何节点时,Head将始终指向null。在第一次插入时,头值可以存储在临时指针中,并返回临时指针而不是头部。

答案 1 :(得分:1)

如果您尝试以相反的顺序打印链接列表,这是一个可用的版本:

#include <iostream>
#include <limits>
#include <ios>

using namespace std;

struct Node {
    int value;
    Node *next;

    Node(int val, Node *nextPtr) {
        value = val;
        next = nextPtr;
    }
};

Node *getInput() {
    Node *head = nullptr;
    Node *tmp;

    while (true) {
        int x;
        if (!(cin >> x)) {
            break;
        } else if (head == nullptr) {
            head = new Node(x, nullptr);
        } else {
            tmp = new Node(x, nullptr);
            tmp->next = head;
            head = tmp;
        }
    }

    return head;
}

int main() {
    Node *head = getInput();
    Node *tmp;
    while (head != nullptr) {
        cout << head->value << ", ";
        tmp = head;
        head = head->next;
        delete tmp;
    }
    cout << endl;

    return 0;
}

答案 2 :(得分:1)

有几个很好的解决方案,但由于请求是针对后退列表,这可能非常非常简单。

Node* getInput()
{
    Node* head = nullptr;
    int x;
    while (std::cin >> x) // keep going until we can't get a good x.
    {
        head = new Node{x, head}; // point node at current head, assign new head
        // head always points at the beginning of list because items are 
        // always inserted at the start of the list.
    }
    return head;
}

因此,要证明此列表向后打印,这里是一个简单的测试人员

int main()
{
    Node* cur = getInput();
    while (cur)
    {
        std::cout << cur->value << '\n';
        cur = cur->next;
    }
}

答案 3 :(得分:0)

head = head->next;是问题所在。您正确地分配了Node,但是您立即泄漏Nodehead指向nullptr

最简单的解决方案是将head指向最近的Node。第一次插入时您需要一个特殊情况,因为head将是未初始化的(顺便说一下,请修复),但这样您始终指向最近的Node

如果遇到问题,请用箭头在纸上画出Node。观察每次插入时箭头的变化情况,您就会看到发生了什么。