bg9848
bg9848

Reputation: 322

getting user input to form linked list

I'm trying to create a linked list from user input but it's not printing anything when i try to print it. Not even the head. Also note, it is intentionally backwards.

Here is my function for getting user input, it returns the list. I know it is wrong but i've spent hours on it and can't get it to work...

#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;
}

Upvotes: 0

Views: 1879

Answers (4)

user4581301
user4581301

Reputation: 33932

A couple of good solutions up, but because the request was for a backward list, this can be really, really simple.

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;
}

So to prove this list prints backward, here's a simple tester

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

Upvotes: 1

pgngp
pgngp

Reputation: 1562

If you are trying to print the linked list in reverse order, here's a working version:

#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;
}

Upvotes: 1

Krishna
Krishna

Reputation: 11

The return value of get input() is not the actual head/start of the list. Head will always point to null the moment you insert any node. Head value can be stored in a temporary pointer during first insert and return temporary pointer instead of head.

Upvotes: 1

Stephen Newell
Stephen Newell

Reputation: 7828

head = head->next; is the problem. You're allocating a Node correctly, but you immediately leak that Node and head is pointing to nullptr.

The simplest solution is to keep head pointed at the most recent Node. You'll need a special case for the first insertion since head will be uninitialized (fix that by the way), but that way you're always pointing at the most recent Node.

If you have trouble, draw your Nodes out on paper with arrows. Watch how the arrows change at each insertion, and you'll see what's happening.

Upvotes: 0

Related Questions