Перейти к содержанию
СофтФорум - всё о компьютерах и не только

Помогите с с++


Рекомендуемые сообщения

Не могу разобраться с оператором "last->next = node;" какую роль он играет в программе, как я понял - "last->next" указывает на следующий элемент после последнего, но зачем тогда в нем сохранять адрес элемента "node"?

#ifndef MYLIST_H_#define MYLIST_H_template<class T> class List{   private:       List* prev;       List* next;       List* first; //первый элемент       List* last;  //последний элемент       List* node;  //узел       T val;       int count;   public:       List() : prev(0), next(0), first(0), last(0), node(0), count(0) {}       void add();       void print();};#endif
#include "mylist.h"#include <iostream>using std::cin;using std::cout;template<class T>void List<T>::add(){   node = new List;   T v;   cin >> v;   node->val = v;   node->next = 0;   if (!count)       first = node;   else       last->next = node;   last = node;   count++;}template<class T>void List<T>::print(){   node = first;   while (node)   {       cout << node->val << '\n';       node = node->next;   }}
Ссылка на комментарий
Поделиться на другие сайты

По воводу вашего вопроса - присвоение last->next = node; делается для того, чтобы для текущего последнего элемента списка указать что есть следующий элемент (чтобы он был виден при обходе в print).

Код некорректен.

1) Нельзя отделять определения шаблонных классов от реализации. Если так делать, то всегда прийдётся включать как .h так .cpp файл. Иначе компилятор не сможет найти реализацию для конкретного шаблона.

2) Я бы не стал пихать все поля в один класс. Так, count, first и last - относятся ко всему списку, а next и prev - только к элементу списка.

3) Вывод вообще к списку не имеет никакого отношения, как и то, откуда получается элемент.

4) Есть std::list

Вот исправленный, компилирующийся код.

#ifndef LIST_H#define LIST_H#include <stddef.h>template<class T>class List{private:struct Node{ Node *prev; // Предыдущий элемент Node *next; // Следующий элемент T data;  // Значение};Node *first; // Первый элементNode *last; // Последний элементsize_t total; // Число элементов в спискеpublic:List();void print() const;size_t size() const;void push_back(const T &val);};#include <iostream>using std::cout;using std::endl;template<class T>List<T>::List():first(NULL), last(NULL), total(0){}template<class T>void List<T>::push_back(const T &data){Node *node = new Node();node->data = data;node->next = NULL;if (this->last != NULL){ node->prev = this->last; this->last->next = node;}else{ node->prev = NULL; this->first = node;}this->last = node;total++;}template<class T>void List<T>::print() const{cout << "Printing list content" << endl;Node *node = this->first;while (node != NULL){ cout << node->data << endl; node = node->next;}}template<class T>size_t List<T>::size() const{return this->total;}#endif /* LIST_H */
Ссылка на комментарий
Поделиться на другие сайты

  • 1 месяц спустя...

Нужна программа, которая подсчитывает двухбуквенные сочетания. Подскажите как реализовать ?

посмотрите справку по теме "Регулярные выражения"...

Ссылка на комментарий
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...