
С++ Добавить к коду следующие: 1. PopBack (удаление с конца) 2. Insert (добавление по индексу) 3.
RemoveAt (удаление по индексу) 4. operator + 5. Конструктор копирования 6. Сортировка 7. GetUnique, который возвращает новый лист ТОЛЬКО из уникальных элементов Сам код: #include #include using namespace std; // Одна ячейка односвязного списка // В структуре всё по-умолчанию public // T - шаблон. Позволяет создавать объекты, указывая тип данных T template struct Node { T value; // значение ячейки Node* pNext; // указатель на следующую ячейку Node(T value = T()) { this->value = value; this->pNext = nullptr; } }; // Односвязный список template class ForwardList { // Node будет заменяться на Node typedef Node Node; Node* head; // указатель на первую ячейку unsigned int size; // кол-во ячеек (unsigned int - инты без минуса) public: ForwardList() { head = nullptr; // head = 00000000 size = 0; } unsigned int GetSize() const { return size; } void PushFront(const T value) { size++; // Если список пуст if (head == nullptr) { // Создаю новую ячейку и привязываю её к указателю на первую ячейку head = new Node(value); // окончить функцию (дальше не сработет) return; } // Если список не был пуст // Создаю новую ячейку, которая станет первой Node* temp = new Node(value); // Следующей от темп будет нынешняя первая ячейка temp->pNext = head; // Переключую указатель на первую ячейку на новосозданную head = temp; } void PopFront() { if (head == nullptr) return; // Сохраняем адрес второй ячейки Node* temp = head->pNext; // удаляем первую ячейку delete head; // переключаем голову на вторую (теперь первую) ячейку head = temp; size--; } // !!! НЕОПТИМИЗИРОВАННО ИЗ-ЗА СПЕЦИФИКИ ОДНОСВЯЗНОГО СПИСКА void PushBack(const T value) { size++; if (head == nullptr) { head = new Node(value); return; } // Создаю указатель для перебора ячеек Node* temp = head; // Переключаю указатель на последнюю ячейку while (temp->pNext != nullptr) temp = temp->pNext; // Создаю новую ячейку после последней temp->pNext = new Node(value); } // Вывод односвязного списка на экран void Print() const { // Создаем указатель для перебора ячеек // Сначала он будет указывать на первую ячейку Node* temp = head; // Перебираем ячейки до тех пор пока не вылезем за пределы while (temp != nullptr) { // Вывожу значение ячейки на экран std::cout << temp->value << " "; // Переключаю указатель на следующую ячейку temp = temp->pNext; } std::cout << std::endl; } bool operator ==(const ForwardList & other) const { if (this->size != other.size) return false; // Указатель для перебора this листа Node* thisTemp = this->head; // указатель для перебора other листа Node* otherTemp = other.head; // перебираем пока не переберём весь лист while (thisTemp != nullptr) { // Если пара ячеек не совпала по значению - списки не равны if (thisTemp->value != otherTemp->value) return false; thisTemp = thisTemp->pNext; otherTemp = otherTemp->pNext; } // Если до сюда ни разу не сработал return false - значит все ок и списки равны return true; } }; int main() { // DZ // 1. PopBack (удаление с конца) // 2. Insert (добавление по индексу) // 3. RemoveAt (удаление по индексу) // 4. operator + // 5. Конструктор копирования // 6. Сортировка // 7. GetUnique, который возвращает новый лист ТОЛЬКО из уникальных элементов ForwardList fl; fl.PushBack(1); fl.PushBack(2); fl.PushBack(3); ForwardList fl2; fl2.PushBack(1); fl2.PushBack(2); fl2.PushBack(3); if (fl == fl2) std::cout << "LISTS ARE EQUAL" << std::endl; }

Ответы на вопрос

Объяснение:
Для добавления описанных функций к классу `ForwardList`, вам необходимо выполнить следующие шаги. Ниже представлен код с комментариями, которые поясняют каждый шаг:
```cpp
#include <iostream>
#include <set> // Для сортировки и поиска уникальных элементов
using namespace std;
template <typename T>
struct Node {
T value;
Node* pNext;
Node(T value = T()) {
this->value = value;
this->pNext = nullptr;
}
};
template <typename T>
class ForwardList {
typedef Node<T> Node;
Node* head;
unsigned int size;
public:
// Остальной код без изменений
// 1. PopBack (удаление с конца)
void PopBack() {
if (size == 0)
return;
if (size == 1) {
delete head;
head = nullptr;
size = 0;
return;
}
Node* temp = head;
while (temp->pNext->pNext != nullptr) {
temp = temp->pNext;
}
delete temp->pNext;
temp->pNext = nullptr;
size--;
}
// 2. Insert (добавление по индексу)
void Insert(unsigned int index, const T value) {
if (index == 0) {
PushFront(value);
return;
}
if (index >= size) {
PushBack(value);
return;
}
Node* temp = head;
for (unsigned int i = 0; i < index - 1; i++) {
temp = temp->pNext;
}
Node* newNode = new Node(value);
newNode->pNext = temp->pNext;
temp->pNext = newNode;
size++;
}
// 3. RemoveAt (удаление по индексу)
void RemoveAt(unsigned int index) {
if (index >= size)
return;
if (index == 0) {
PopFront();
return;
}
if (index == size - 1) {
PopBack();
return;
}
Node* temp = head;
for (unsigned int i = 0; i < index - 1; i++) {
temp = temp->pNext;
}
Node* toDelete = temp->pNext;
temp->pNext = toDelete->pNext;
delete toDelete;
size--;
}
// 4. operator +
ForwardList operator+(const ForwardList& other) {
ForwardList result(*this);
Node* temp = other.head;
while (temp != nullptr) {
result.PushBack(temp->value);
temp = temp->pNext;
}
return result;
}
// 5. Конструктор копирования
ForwardList(const ForwardList& other) {
head = nullptr;
size = 0;
Node* temp = other.head;
while (temp != nullptr) {
PushBack(temp->value);
temp = temp->pNext;
}
}
// 6. Сортировка
void Sort() {
if (size <= 1)
return;
for (unsigned int i = 0; i < size - 1; i++) {
Node* temp = head;
for (unsigned int j = 0; j < size - i - 1; j++) {
if (temp->value > temp->pNext->value) {
T tmpValue = temp->value;
temp->value = temp->pNext->value;
temp->pNext->value = tmpValue;
}
temp = temp->pNext;
}
}
}
// 7. GetUnique, который возвращает новый лист ТОЛЬКО из уникальных элементов
ForwardList GetUnique() {
ForwardList result;
set<T> uniqueSet;
Node* temp = head;
while (temp != nullptr) {
uniqueSet.insert(temp->value);
temp = temp->pNext;
}
for (const T& value : uniqueSet) {
result.PushBack(value);
}
return result;
}
};
int main() {
// Остальной код без изменений
return 0;
}
```
Теперь у вас есть реализация методов `PopBack`, `Insert`, `RemoveAt`, перегрузки оператора `+`, конструктора копирования, сортировки и `GetUnique`. Вы можете использовать их в своей программе для работы с односвязным списком `ForwardList`.
Проверь!



Для добавления функциональности, которую вы описали, в ваш класс ForwardList
, вам нужно внести несколько изменений. Ниже приведен полный код с добавленными методами и функциями:
cpp#include <iostream>
template <typename T>
struct Node {
T value;
Node* pNext;
Node(T value = T()) : value(value), pNext(nullptr) {}
};
template <typename T>
class ForwardList {
private:
Node<T>* head;
unsigned int size;
public:
ForwardList() : head(nullptr), size(0) {}
unsigned int GetSize() const {
return size;
}
void PushFront(const T value) {
size++;
if (head == nullptr) {
head = new Node<T>(value);
return;
}
Node<T>* temp = new Node<T>(value);
temp->pNext = head;
head = temp;
}
void PopFront() {
if (head == nullptr) return;
Node<T>* temp = head->pNext;
delete head;
head = temp;
size--;
}
void PushBack(const T value) {
size++;
if (head == nullptr) {
head = new Node<T>(value);
return;
}
Node<T>* temp = head;
while (temp->pNext != nullptr) temp = temp->pNext;
temp->pNext = new Node<T>(value);
}
// Вывод односвязного списка на экран
void Print() const {
Node<T>* temp = head;
while (temp != nullptr) {
std::cout << temp->value << " ";
temp = temp->pNext;
}
std::cout << std::endl;
}
bool operator ==(const ForwardList<T>& other) const {
if (this->size != other.size) return false;
Node<T>* thisTemp = this->head;
Node<T>* otherTemp = other.head;
while (thisTemp != nullptr) {
if (thisTemp->value != otherTemp->value) return false;
thisTemp = thisTemp->pNext;
otherTemp = otherTemp->pNext;
}
return true;
}
// Метод для удаления последнего элемента
void PopBack() {
if (head == nullptr) return;
size--;
if (head->pNext == nullptr) {
delete head;
head = nullptr;
return;
}
Node<T>* temp = head;
while (temp->pNext->pNext != nullptr) temp = temp->pNext;
delete temp->pNext;
temp->pNext = nullptr;
}
// Метод для вставки элемента по индексу
void Insert(const T value, unsigned int index) {
if (index > size) return;
if (index == 0) {
PushFront(value);
return;
}
size++;
Node<T>* temp = head;
for (unsigned int i = 0; i < index - 1; i++) temp = temp->pNext;
Node<T>* newNode = new Node<T>(value);
newNode->pNext = temp->pNext;
temp->pNext = newNode;
}
// Метод для удаления элемента по индексу
void RemoveAt(unsigned int index) {
if (index >= size) return;
if (index == 0) {
PopFront();
return;
}
size--;
Node<T>* temp = head;
for (unsigned int i = 0; i < index - 1; i++) temp = temp->pNext;
Node<T>* toDelete = temp->pNext;
temp->pNext = temp->pNext->pNext;
delete toDelete;
}
// Оператор сложения для объединения двух списков
ForwardList<T> operator +(const ForwardList<T>& other) const {
ForwardList<T> result(*this);
Node<T>* temp = other.head;
while (temp != nullptr) {
result.PushBack(temp->value);
temp = temp->pNext;
}
return result;
}
// Конструктор копирования
ForwardList(const ForwardList<T>& other) : head(nullptr), size(0) {
Node<T>* otherTemp = other.head;
while (otherTemp != nullptr) {
PushBack(otherTemp->value);
otherTemp = otherTemp->pNext;
}
}
// Сортировка списка (вставкой)
void Sort() {
if (size <= 1) return;
Node<T>* newHead = nullptr;
Node<T>* current = head;
while (current != nullptr) {
Node<T>* next = current->pNext;
if (newHead == nullptr || current->value < newHead->value) {
current->pNext = newHead;
newHead = current;
} else {
Node<T>* search = newHead;
while (search->pNext != nullptr && search->pNext->value <= current->value) {
search = search->pNext;
}
current->pNext = search->pNext;
search->pNext = current;
}
current = next;
}
head = newHead;
}
// Получение нового списка из уникальных элементов
ForwardList<T> GetUnique() const {
ForwardList<T> uniqueList;
Node<T>* temp = head;
while (temp != nullptr) {
if (!uniqueList.Contains(temp->value)) {
uniqueList.PushBack(temp->value);
}
temp = temp->pNext;
}
return uniqueList;
}
// Проверка, содержит ли список элемент с заданным значением
bool Contains(const T& value) const {
Node<T>* temp = head;
while (temp != nullptr) {
if (temp->value == value) {
return true;
}
temp = temp->pNext;
}
return false;
}
~ForwardList() {
while (head != nullptr) {
PopFront();
}
}
};
int main() {
ForwardList<int> list1;
list1.PushBack(1);
list1.PushBack(2);
list1.PushBack(3);
ForwardList<int> list2;
list2.PushBack(3);
list2.PushBack(4);
list2.PushBack(5);
std::cout << "List 1: ";
list1.Print();
std::cout << "List 2: ";
list2.Print();
if (list1 == list2) {
std::cout << "List 1 is equal to List 2" << std::endl;
} else {
std::cout << "List 1 is not equal to List 2" << std::endl;
}
list1.PopBack();
std::cout << "After PopBack: ";
list1.Print();
list1.Insert(0, 1);
std::cout << "After Insert: ";
list1.Print();
list1.RemoveAt(1);
std::cout << "After RemoveAt: ";
list1.Print();
ForwardList<int> list3 = list1 + list2;
std::cout << "List 3 (List 1 + List 2): ";
list3.Print();
list3.Sort();
std::cout << "Sorted List 3: ";
list3.Print();
ForwardList<int> uniqueList = list3.GetUnique();
std::cout << "Unique List 3: ";
uniqueList.Print();
return 0;
}
Этот код добавляет все функции, которые вы описали, и включает примеры их использования в функции main()
. Вы можете использовать этот код как отправную точку для вашей программы.


Похожие вопросы
Топ вопросов за вчера в категории Информатика







Последние заданные вопросы в категории Информатика
-
Математика
-
Литература
-
Алгебра
-
Русский язык
-
Геометрия
-
Английский язык
-
Химия
-
Физика
-
Биология
-
Другие предметы
-
История
-
Обществознание
-
Окружающий мир
-
География
-
Українська мова
-
Информатика
-
Українська література
-
Қазақ тiлi
-
Экономика
-
Музыка
-
Право
-
Беларуская мова
-
Французский язык
-
Немецкий язык
-
МХК
-
ОБЖ
-
Психология
-
Физкультура и спорт
-
Астрономия
-
Кыргыз тили
-
Оʻzbek tili