Почему нельзя изменить значение в объекте? Также как я могу улучшить этот связанный список? - PullRequest
0 голосов
/ 11 июля 2020

Я новичок в C ++, так как пришел из java и python. Вот моя попытка связанного списка. Я попытался инициализировать узел данными, но это не сработало, скорее, в функции добавления, которую мне пришлось передать в данных, чтобы они отобразились. Как я могу это улучшить, прежде чем убедиться, что последний узел указывает на нуль, у меня была ошибка памяти ex c плохой доступ, почему так.

    #include <iostream>

using namespace std;

struct Node{
    int data;
    Node* next;
    Node(int data){
        this->data = data;
    }
};

class LinkedList{
private:
    Node* head;

public:
    void showList(){
        Node* temp = head;
        while (temp->next != NULL){
            cout << temp->data << endl;
            temp = temp->next;
            if (temp->next == NULL){
                cout << temp->data << endl;
            }
        }
    }
    void append(int data) {
        Node* nodeToAdd = new Node(data);
        nodeToAdd->data = data;
        nodeToAdd->next = NULL;

        Node* temp = head;
        if (head->next == NULL){
            head->next = nodeToAdd;

            return;
        }
        while (temp->next != NULL) {
            temp = temp->next;
        }
        temp->next = nodeToAdd;
    }

    LinkedList(){
        head->next = NULL;
        cout << "Linked list created" << endl;
    }
};

int random(int upto){
    int random = rand() % 100+1;
    return random;
}

int main() {
    LinkedList theLink;
    for (int i = 0; i < 100; ++i) {
        theLink.append(i);
    }
    theLink.showList();
    cout << "Finished" << endl;
    return 0;
}

1 Ответ

2 голосов
/ 11 июля 2020

Ваша программа неправильно сформирована / имеет неопределенное поведение из-за разыменования head (например, с помощью if (head->next == NULL) ...), хотя указатель head никогда не инициализируется.

Ваш append должен проверить, установлено ли уже head в значение, прежде чем проходить через все элементы head->next. Также соответствующим образом адаптируйте список отображения.

class LinkedList{
private:
    Node* head = nullptr;

public:
    void append(int data) {
        Node* nodeToAdd = new Node(data);

        if (head == nullptr) {
           head = nodeToAdd;
        }
        else {
           Node* temp = head;
           while (temp->next != NULL) {
             temp = temp->next;
           }
        ...

также, аналогично с Node :: next, поэтому после добавления первого узла произойдет сбой. Итак,

struct Node
{
    int data;
    Node *next;
    Node(int data)
    {
        this->data = data;
        this->next = nullptr;
    }
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...