Помогите пожалуйста нужно написать на c++
Написать реализацию односвязного линейного списка на классах. Инкапсулировать класс "Нода" в класс "Список".
методы:
- добавление элемента
- удаление элемента
- свап
- получение значения из элемента
- установка значения из элемента
- получить первый элемент
- получить последний элемент
- очистить список
- вывод всех элементов списка
Ответы
Ответ:
Сначала нужно создать класс для ноды, которая хранит значение и указатель на следующую ноду:
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_;
};