• Предмет: Информатика
  • Автор: timurvasilivish777
  • Вопрос задан 3 месяца назад

Помогите пожалуйста нужно написать на c++

Написать реализацию односвязного линейного списка на классах. Инкапсулировать класс "Нода" в класс "Список".

методы:

- добавление элемента

- удаление элемента

- свап

- получение значения из элемента

- установка значения из элемента

- получить первый элемент

- получить последний элемент

- очистить список

- вывод всех элементов списка

Ответы

Ответ дал: makason512
1

Ответ:

Сначала нужно создать класс для ноды, которая хранит значение и указатель на следующую ноду:

class Node {

public:

 // конструктор, который устанавливает значение узла

 Node(int value) : value_(value), next_(nullptr) {}

 // геттеры для получения значения узла и указателя на следующий узел

 int value() const { return value_; }

 Node* next() const { return next_; }

 // сеттер для установки указателя на следующий узел

 void set_next(Node* next) { next_ = next; }

private:

 // значение узла

 int value_;

 // указатель на следующий узел

 Node* next_;

};

Теперь можно создать класс списка, который будет хранить указатель на первый элемент списка (голову) и все методы:

class List {

public:

 // конструктор, который устанавливает голову списка в nullptr

 List() : head_(nullptr) {}

 // деструктор, который удаляет все узлы в списке

 ~List() {

   Node* current = head_;

   while (current != nullptr) {

     Node* next = current->next();

     delete current;

     current = next;

   }

 }

  // метод добавления узла в начало списка

 void AddToFront(int value) {

   // создаем новый узел

   Node* new_node = new Node(value);

   // помещаем его в начало списка

   new_node->set_next(head_);

   head_ = new_node;

 }

 // метод удаления узла из списка

 void Remove(int value) {

   // если список пуст, ничего не делаем

   if (head_ == nullptr) {

     return;

   }

   // если первый узел - тот, что нужно удалить, удаляем его

   if (head_->value() == value) {

     Node* to_delete = head_;

     head_ = head_->next();

     delete to_delete;

     return;

   }

   // иначе ищем узел, который нужно удалить

   Node* current = head_;

   while (current->next() != nullptr && current->next()->value() != value) {

     current = current->next();

   }

   // если узел не найден, ничего не делаем

   if (current->next() == nullptr) {

     return;

   }

   // иначе удаляем узел

   Node* to_delete = current->next();

   current->set_next(to_delete->next());

   delete to_delete;

 }

 // метод свапа значений двух узлов

 void Swap(int value1, int value2) {

   // если список пуст, ничего не делаем

   if (head_ == nullptr) {

     return;

   }

   // ищем первый узел

   Node* current1 = head_;

   while (current1 != nullptr && current1->value() != value1) {

     current1 = current1->next();

   }

   // если узел не найден, ничего не делаем

   if (current1 == nullptr) {

     return;

   }

   // ищем второй узел

   Node* current2 = head_;

   while (current2 != nullptr && current2->value() != value2) {

     current2 = current2->next();

   }

   // если узел не найден, ничего не делаем

   if (current2 == nullptr) {

     return;

   }

   // свапаем значения узлов

   int temp = current1->value();

   current1->set_value(current2->value());

   current2->set_value(temp);

 }

 // метод получения значения узла

 int GetValue(int value) const {

   // ищем узел

   Node* current = head_;

   while (current != nullptr && current->value() != value) {

     current = current->next();

   }

   // если узел не найден, возвращаем ноль

   if (current == nullptr) {

     return 0;

   }

   // иначе возвращаем значение узла

   return current->value();

 }

 // метод установки значения узла

 void SetValue(int old_value, int new_value) {

   // ищем узел

   Node* current = head_;

   while (current != nullptr && current->value() != old_value) {

     current = current->next();

   }

   // если узел не найден, ничего не делаем

   if (current == nullptr) {

     return;

   }

   // иначе устанавливаем новое значение узла

   current->set_value(new_value);

 }

 }

 // метод получения последнего элемента списка

 Node* GetLast() const {

   // если список пуст, возвращаем nullptr

   if (head_ == nullptr) {

     return nullptr;

   }

   // иначе ищем последний элемент

   Node* current = head_;

   while (current->next() != nullptr) {

     current = current->next();

   }

   return current;

 }

 // метод очистки списка

 void Clear() {

   // удаляем все узлы в списке

   Node* current = head_;

   while (current != nullptr) {

     Node* next = current->next();

     delete current;

     current = next;

   }

   // устанавливаем голову списка в nullptr

   head_ = nullptr;

 }

 // метод вывода всех элементов списка

 void Print() const {

   // перебираем все узлы в списке

   Node* current = head_;

   while (current != nullptr) {

     // выводим значение узла

     std::cout << current->value() << " ";

     current = current->next();

   }

   // добавляем перевод строки в конце вывода

   std::cout << std::endl;

 }

private:

 // указатель на голову списка

 Node* head_;

};

Вас заинтересует
7 лет назад