Односвязный список с использованием шаблона со структурой в качестве элементов в C ++; - PullRequest
1 голос
/ 20 сентября 2019

Я пытаюсь создать связанный список для хранения информации об ученике, с учащимся такая структура:

struct Student
{
    int id;
    string name;
    //etc
};

У меня есть два шаблона для узла и списка с базовой функцией:

template <class T>
struct Node {
    T data;
    Node <T> *pNext;
    Node () : pNext(NULL) {}
    Node (T &a) : data(a), pNext(NULL) {}
};

template <class T>
class LinkedList
{
    Node <T> *Head;
    size_t lSize;
public:
    LinkedList(): Head(NULL), lSize(0) {}
    ~LinkedList();

    void linsert(T& a);
};

С помощью linsert () для вставки нового узла в начало списка:

template <class T>
void LinkedList<T>::linsert(T& a)
{
    if (Head==nullptr)
        Head=a;
    else
    {
        a->pNext=Head;
        Head=a;
    }
    lSize++;
}

Для тестирования: я попытался создать новые узлы и связать ихвручную (без использования связанного списка), и все, кажется, работает нормально:

Node <Student> *s1 = new Node <Student>;
s1->data.id=1;
s1->data.name="Anna";

Node <Student> *s2 = new Node <Student>;
s2->data.id=2;
s2->data.name="Bob";
s1->pNext=s2;

Node <Student> *s3 = new Node <Student>;
s3->data.id=3;
s3->data.name="James";
s2->pNext=s3;

Вот проблема: я попытался создать новый связанный список и использовать linsert () для добавленияновые студенты в списке с простым циклом for:

LinkedList <Node<Student>> *l=new LinkedList <Node<Student>>;

for (int=0; i<10; i++)
{
    Node <Student> *s = new Node <Student>;
    s->data.id=i;
    s->data.name="Name";

    l->linsert(s);
}

При компиляции я получаю это сообщение об ошибке, указывающее на строку

l->linsert(s);
error: no matching function for call to 'LinkedList<Node<Student> >::linsert(Node<Student>*&)'
note: candicate: void LinkedList<T>::linsert(T&) [With T=Node<Student>]
note: no known conversion from argument 1 from 'Node<Student>*' to 'Node<Student>&'

У меня всегда возникают проблемы с использованием указателяи ссылка, так что после хорошего часа, ничего не придумав, я сдался.Пожалуйста, помогите мне решить эту проблему.

Я использую CodeBlock, и если я смогу улучшить эти коды, буду признателен, если вы мне расскажете.

1 Ответ

5 голосов
/ 20 сентября 2019

Ваш linsert() реализован неправильно.Он должен принять Student в качестве входных данных и создать для него новый узел.Вы пытаетесь создать узлы вне linsert() и передать их, что не является правильным способом использования классов связанного списка.Управление узлами должно храниться внутри класса.

Попробуйте вместо этого:

template <class T>
void LinkedList<T>::linsert(T& a)
{
    Node<T> *n = new Node<T>(a);
    n->pNext = Head;
    Head = n;
    ++lSize;
}
LinkedList<Student> l;

for (int i = 0; i < 10; i++)
{
    Student s;
    s.id = i;
    s.name = "Name";
    l.linsert(s);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...