Работа с односвязными списками(удаление четных элементов, добавление нвого ) с++

нужно реализовать 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 :)

→ Ссылка