Работа с односвязными списками(удаление четных элементов, добавление нвого ) с++
нужно реализовать 2 функции:
1)удаляет из списка L1 все узлы в четных позициях
2)вставляет в список L2 после каждой пары узлов новый узел со значением равным сумме значений двух предыдущих узлов.
#include <iostream>
#include <string>
using namespace std;
class List
{
public:
List();
void push_back(int);
void zapolnenie();
void sozdanieL(List, List);
void del_chet(); // не работает
void insert(); // не работает
int GetSize() { return size;}
int& operator[](const int index);
private:
class Node
{
public:
Node *pNext;
int data;
Node(int data=int(), Node *pNext = nullptr)
{
this->data = data;
this->pNext = pNext;
}
};
int size;
Node *head;
};
List::List()
{
size = 0;
head = nullptr;
}
void List::push_back(int data)
{
if (head == nullptr)
{
head = new Node(data);
}
else
{
Node *current = this->head;
while (current->pNext != nullptr)
{
current = current->pNext;
}
current->pNext = new Node(data);
}
size++;
}
void List::zapolnenie()
{
int number;
cin >> number;
for (int i = 0; i < number; i++)
{
push_back(rand() % 10);
}
}
void List::sozdanieL(List, List)
{
List L;
for (int i = 0; i < GetSize(); i++)
{
}
}
void List::del_chet() // удалить из списка L1 все узлы в четных позициях
{
for (int index = 1; index < GetSize(); index++)
{
if (index % 2 == 0)
{
Node* previous = this->head;
for (int i = 0; i < index - 1; i++)
{
previous = previous->pNext;
}
Node* toDel = previous->pNext;
previous->pNext = toDel->pNext;
delete toDel;
size--;
}
}
}
int& List::operator[](const int index)
{
int counter = 0;
Node *current = this->head;
while (current != nullptr)
{
if (counter == index)
{
return current->data;
}
current = current->pNext;
counter++;
}
}
void List::insert() // вставить на каждую третью позицию узел со значением равным сумме значений двух предыдущих узлов.
{
for (int index=0; index <= GetSize(); index++)
{
if (index % 3 == 0 && index == 2)
{
Node *previous = this->head;
for (int i = 0; i < index - 1; i++)
{
previous = previous->pNext;
}
Node* newNode = new Node(5, previous->pNext);
previous->pNext = newNode;
size++;
}
}
}
int main()
{
setlocale(LC_ALL, "ru");
List L1;
List L2;
L1.zapolnenie();
for (int i = 0; i < L1.GetSize(); i++)
{
cout << L1[i] << endl;
}
cout << endl;
L1.del_chet();
for (int i = 0; i < L1.GetSize(); i++)
{
cout << L1[i] << endl;
}
return 0;
}
В коде пометил, что именно не получается реализовать.
Ответы (1 шт):
Автор решения: Павел Ериков
→ Ссылка
Пример функции insert с комментариями:
void List::insert()
{
//Изначальный размер
int ssize = GetSize();
//Значение первого слагаемого
int prev_data = head->data;
//Указатель на второе слагаемое
Node* node = this->head->pNext;
for (int i = 1; i < ssize; i += 2) {
//Сумма двух элементов
Node* newNode = new Node(prev_data + node->data);
//Вставляем после второго слагаемого их сумму
Node* tmp = node->pNext;
node->pNext = newNode;
newNode->pNext = tmp;
++size;
//Получаем значение следующего первого слагаемого
//и переключаемся на второе
if (tmp != nullptr) {
prev_data = tmp->data;
node = tmp->pNext;
}
}
}
Функцию del_chet попробуйте написать сами похожим образом. Проблема в index ведь размер у вас меняется и значит индексы элементов меняются. И лучше создать переменную Node* которая будет указывать сразу на элемент на четной позиции и тогда останется только удалить его. Эта функция еще проще insert :)