C ++ Связанный список печатает только первые 3 узла - PullRequest
0 голосов
/ 29 апреля 2020

Когда вы запускаете код, он ничего не печатает, если вы не запустите его с 3-мя добавлениями. Это почему? Внутри кода я добавил оператор cout, чтобы проверить, выполнялся ли он, и когда я добавил 4 вещи в связанный список, он выполнялся только один раз в функции добавления. Но когда я запустил его, добавив в список только 3 вещи, он отобразил оператор cout 3x.

main. cpp:

#include <iostream>
#include "node.h"
using namespace std;

int main()
{
    LL list;
    list.append("jack","2");
    list.append("jack","1");
    list.append("jack","3");
    list.append("jack","4");
    //list.insertatBegin("notjack","0");
    list.print();
}

. cpp:

#include <iostream>
using namespace std;
#include "node.h"

LL::LL()
{
    head = nullptr;
}

void LL::append(string pName,string phone)
{
    Node *nodePtr;
    if (head == nullptr)
    {
        head = new Node;
        head->name = pName;
        head->phoneNumber = phone;
        head->next = nullptr;
    }
    else
    {
        nodePtr = head;
        while(nodePtr->next !=nullptr)
        {
            nodePtr = nodePtr->next;
        }
        nodePtr->next = new Node;
        nodePtr->next->name = pName;
        nodePtr->next->phoneNumber = phone;
        nodePtr->next->next = nullptr;
    }

}

void LL::print()
{
    //cout << "ran" <<endl;
    Node *nodePtr;
    nodePtr = head;
    while (nodePtr == nullptr)
    {
        cout << nodePtr ->name << " " << nodePtr->phoneNumber <<endl;
        nodePtr = nodePtr->next;
    }
}

node.h:

#ifndef NODE_H
#define NODE_H
#include <iostream>
using namespace std;

class Node
{
public:
    string name; //data
    string phoneNumber;
    Node* next;  //pointer to next

};

class LL
{
private:
    Node* head; // list header
public:
    LL();
    void append(string pName,string phone);
    void insertatBegin(string pName,string phone);
    void print();
};


#endif

Ответы [ 2 ]

2 голосов
/ 29 апреля 2020

Есть 2 проблемы с вашим кодом:

  1. append() имеет неопределенное поведение , потому что newNode равно неинициализировано . Его значение равно неопределено , что указывает на случайную память. Вы не указываете на действительный new 'ed экземпляр Node, прежде чем пытаться его заполнить.

  2. print() вообще не просматривает список.

Попробуйте это:

void LL::append(string pName,string phone)
{
    Node *newNode = new Node; // <-- notice 'new'!

    // these assignments really should be handled by a constructor...
    newNode->name = pName;
    newNode->phoneNumber = phone;
    newNode->next = nullptr;

    if (head == nullptr)
    // better: if (!head)
    {
        cout << "it ran" <<endl;
        head = newNode;
    }
    else
    {
        cout << "it ran2" <<endl;
        Node *nodePtr = head;
        while (nodePtr->next != nullptr)
        // better: while (nodePtr->next)
        {
            nodePtr = nodePtr->next;
        }
        nodePtr->next = newNode;
    }
}

void LL::print()
{
    //cout << "ran" <<endl;
    Node *nodePtr = head;
    while (nodePtr != nullptr) // <-- '!=', not '=='
    // better: while (nodePtr)
    {
        cout << nodePtr ->name << " " << nodePtr->phoneNumber << endl;
        nodePtr = nodePtr->next;
    }
}

Тем не менее, append() можно упростить немного больше:

class Node
{
public:
    string name; //data
    string phoneNumber;
    Node* next = nullptr;  //pointer to next

    Node(string pName, string phone) : name(pName), phoneNumber(phone) {}
};

void LL::append(string pName,string phone)
{
    Node *newNode = new Node(pName, phone);
    Node **nodePtr = &head;
    while (*nodePtr)
    {
        nodePtr = &((*nodePtr)->next);
    }
    *nodePtr = newNode;

    // Alternatively:
    /*
    Node **nodePtr = &head;
    while (*nodePtr)
    {
        nodePtr = &((*nodePtr)->next);
    }
    *nodePtr = new Node(pName, phone);
    */
}
1 голос
/ 29 апреля 2020

Для начала ваш указатель newNode ни на что не указывает, и вы присваиваете неинициализированным переменным имя, номер телефона и следующий.

Node *nodePtr;
newNode->name = pName;
newNode->phoneNumber = phone;
newNode->next = nullptr;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...