Единый связанный список, ошибка сегментации C ++, добавить в список, распечатать - PullRequest
0 голосов
/ 09 мая 2020

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

#include <iostream>

class T
{
private:
    float t;
public:
    T *next;
    T()
    {
        this->t = 0.0;
        this->next = NULL;
    }
    T(float t, T* next)
    {
        this->t = t;
        this->next = next;
    }
    T(const T& tx)
    {
        this->t = tx.t;
        this->next = tx.next;
    }
    void print()
    {
        std::cout << this->t << "\n";
    }
};

class MyList
{
private:
    T *head;
public:
    T* add_T(T *x)
    {
        T *new_head = new T(*head);
        new_head -> next = head;
        head = new_head;
        return head;
    }
    void print()
    {
        for(T *curr = head; curr != NULL; curr = curr->next)
            curr->print();
    }
};

int main()
{
    MyList ml;
    T a,b,c;

    ml.add_T(&a);
    ml.add_T(&b);
    ml.add_T(&c);
    ml.print();

    return 0;
}

EDIT:

Все еще не то, что я хотел, потому что я вижу 0 из главного узла.

#include <iostream>

class T
{
private:
    float t;
public:
    T *next;
    T()
    {
        this->t = 0.0;
        this->next = NULL;
    }
    T(float t)
    {
        this->t = t;
    }
    T(float t, T* next)
    {
        this->t = t;
        this->next = next;
    }
    T(const T& tx)
    {
        this->t = tx.t;
        this->next = tx.next;
    }
    float getT()
    {
        return this->t;
    }
    void print()
    {
        std::cout << this->t << "\n";
    }
};

class MyList
{
private:
    T *head;
public:
    MyList()
    {
        head = new T();
    }

    T* add_T(T *x)
    {
        head = new T(x->getT(), head);
        return head;
    }
    void print()
    {
        for(T *curr = head; curr != NULL; curr = curr->next)
            curr->print();
    }
};

int main()
{
    MyList ml;
    T a(1),b(2),c(3);

    ml.add_T(&a);
    ml.add_T(&b);
    ml.add_T(&c);
    ml.print();

    return 0;
}

1 Ответ

2 голосов
/ 09 мая 2020

Как сказано в комментарии, вы безоговорочно разыменовываете head, что вызывает неопределенное поведение. Поскольку вы добавляете узлы в голову, вы можете просто сделать что-то вроде:

T* add_T(T *x)
    {
        head = new T(x->getT(), head);
        return head;
    }

Кроме того, предпочитайте использовать nullptr вместо NULL.

Также укажите для всех членов данных значения по умолчанию. например, в вашем конструкторе MyList выполните:

 MyList()
    {
        head = nullptr;
    }
...