Home > OS >  linked list not printing output
linked list not printing output

Time:11-18

I have to dynamically allocate a list of robots for a school project. In an actual program, there will be other member functions that will require the list of names in order to perform certain functions.

As of right now, I just learned about this concept, and have tried really hard to put together some things I have seen online. The issue at the moment is that I can not tell if my list is properly being stored -- I am also getting wonky output when I try to call my display of list function.

Please help if you can. Also, I am happy to hear any tips for literally anything, as I am fairly new to programming.

class Node{
public:
    std::string name_;
    Node* next;
};

class linkedBotList{
public:
    
    linkedBotList() {head = nullptr;} //constructor
    ~linkedBotList(){}; // destructure
    
    void addNode();
    void display();

private:
    Node* head;   
};

int main(int argc, const char * argv[]) {
    linkedBotList* list = new linkedBotList();
    int siz;
    
    std::cout << "How many Robots?" << std::endl;
    std::cout << "What are the names?" << std::endl;
    std::cin >> siz;
    for(int i = 0; i < siz; i  ){
        list->addNode();
    }
    delete list;
    return 0;
}

void linkedBotList::addNode(){
    std::string botName;
    Node* newNode = new Node();
    newNode->name_ = botName;
    newNode->next = nullptr;
    
    std::cin >> botName;
    
    if(head == nullptr){
        head = newNode;
    }
    else {
        Node* temp = head; // head is not null
        while(temp->next != nullptr){ // go until at the end of the list
            temp = temp->next;
        }
        temp->next = new Node; // linking to new node
    }
}

void linkedBotList::display() {
   
    if (head == NULL) {
        std::cout << "List is empty!" << std::endl;
    }
    else {
        Node* temp = head;
        while (temp != NULL) {
            std::cout << "Made it to display funct.\n";
            std::cout << temp->name_ << " ";
            temp = temp->next;
        }
        std::cout << std::endl;
    }
}

I did try a few things, like switching around my temp variable, and a few other re-assignments. Maybe someone can quickly spot the issue and help?

image

CodePudding user response:

Your display function is fine.

The problem is that you have 2 logic flaws in addNode():

  • you are not storing strings in your list correctly. You are assigning botName to newNode->name_ before botName has been assigned a value. So all of your nodes have empty strings. Assigning botName afterwards will not update newNode->name_. 1

  • if the list is not empty, you iterate to the end of the list correctly 2, but then you assign a new blank node to temp->next instead of assigning your newNode that you already populated. And your Node constructor is not initializing the next member to nullptr, so you are creating a corrupted list, which will cause subsequent loops through the list to invoke undefined behavior.

Try this instead:

void linkedBotList::addNode(){
    std::string botName;    
    std::cin >> botName; // <-- move up here
    
    Node* newNode = new Node{botName, nullptr};

    if (!head){
        head = newNode;
    }
    else {
        Node* temp = head;
        while (temp->next){
            temp = temp->next;
        }
        temp->next = newNode; // <-- linking to new node
    }
}

Alternatively, you can eliminate the if like this:

void linkedBotList::addNode(){
    std::string botName;    
    std::cin >> botName;

    Node** temp = &head;
    while (*temp){
        temp = &((*temp)->next);
    }

    *temp = new Node{botName, nullptr};
}

1: A better design would be to have addNode() take in a string as an input parameter, and then move the cin call into your loop in main().

2: consider adding a tail member to your list to avoid having to loop on each addition.

Try this alternate design:

class Node{
public:
    std::string name;
    Node* next = nullptr;
};

class linkedBotList{
public:
    
    linkedBotList() = default;
    ~linkedBotList();
    
    void addNode(std::string name);
    void display() const;

private:
    Node* head = nullptr;
    Node* tail = nullptr;  
};

int main() {
    linkedBotList list;
    int siz;
    std::string botName;
    
    std::cout << "How many Robots?" << std::endl;
    std::cin >> siz;

    std::cout << "What are the names?" << std::endl;
    for(int i = 0; i < siz; i  ){
        std::cin >> botName;
        list.addNode(botName);
    }

    list.display();
    return 0;
}

linkedBotList::~linkedBotList(){
    Node *temp = head, *next;
    while (temp) {
        next = temp->next;
        delete temp;
        temp = next;
    }
}

void linkedBotList::addNode(std::string name){
    Node* newNode = new Node{name};    
    if (tail)
        tail->next = newNode;
    else
        head = newNode;
    tail = newNode;
}

void linkedBotList::display() const {
    if (!head) {
        std::cout << "List is empty!" << std::endl;
    }
    else {
        Node* temp = head;
        do {
            std::cout << temp->name << " ";
            temp = temp->next;
        }
        while (temp);
        std::cout << std::endl;
    }
}
  • Related