Не могу написать условия для удаления элементов

Нужно было создать список вывести его, удалить голову если она нечётная, а если чётная то удалить последний элемент списка и вывести новый список.

#include <iostream>
using namespace std;
struct List {
	int data; 
	List* Next;
};
List* Head = new List;
List* k;

void  delete_Head(int a)
{
	Head = new List;
	while (Head != NULL)
	{
		if (a % 2 != 0)
		{
			k = Head;
			Head = Head->Next;
			delete k;
		}
		else (a % 2 == 0)



	}
}

void new_element(int a)
{
	k = new List;
	k->data = a;
	k->Next = Head;
	Head = k;


}
void print_list()
{
	k = Head;
	while (k != NULL) {
		cout << k->data << " ";
		k = k->Next;
	}
}
int main()
{
	int cnt, a;
		cout << "\nkol-vo elementov";
		cin >> cnt;
	List* Head = NULL;
	List* k;
	for (int i = 1; i <= cnt; i++) {
		cout << "\nVVedite element: ";
		cin >> a;
		new_element(a);
		
	}
	cout << "\nList: ";
	print_list();
	delete_Head();
	cout << "\nList: ";
	print_list();


	return 0;
}

Так тут вроде бы не в цикле четность проверять надо, а просто проверить четность значения в голове. Если нечетное — удалить её, если четное — удалить хвост.

Ну а само удаление это просто что-то делать с указателями в Next / Head. Рисование списка на листочке может помочь.

image

Проблема в том что Head на чётность проверить нельзя ибо Head не целочисленный тип(Int) в этом принципе основная проблема

Тогда можно поиграть в игру “Найди отличия”.
Цель игры:
найти отличия между нумероваными и не нумероваными списками. ))

Так я задание понял как


if (Head == nullptr) 
{
    return;
}

if (Head->data % 2 == 0)
{
    ...
}
else
{
    ...
}

Как то так получилось не знаю где ошибка.

void  delete_Head()
{
	List* k;
	while (Head->data != NULL) {
		if (Head->data % 2 != 0)
		{
			k = Head;
			Head = Head->Next;
			delete k;
		}
		if (Head->data % 2 == 0); {
			k != NULL;
			k = Head->Next;
			delete k;
			Head->Next = Head->Next;

		}

	}

Зачем тут цикл?
Цикл может быть нужен только при поиске хвоста, когда в голове четное.

Выше же примерная структура решения.

теперь проблема не удаляет последний элемент

void  delete_Head()
{
	
	if (Head == nullptr)
	{
		return;
	}
		if (Head->data % 2 != 0)
		{
			k = Head;
			Head = Head->Next;
			delete k;
		}
		if (Head->data % 2 == 0) {
			k = Head->Next;
			delete k;
			Head->Next = Head->Next;

		}

	
	
}

Так говорю ж, надо в цикле дойти до конца списка (предпоследнего элемента) и удалить.

image


При вставке кода надо нажимать кнопку Код.

if (Head->data % 2 == 0) {
			while (Head->Next) {
				k = Head->Next;
				Head->Next = Head->Next;
			}
		}

Типа пройти весь список я только так могу, а условие удаления сообразить не могу.

Чтобы предпоследний найти надо либо Head->Next->Next проверять (и еще проверить, что Head->Next не нулл, на случай списка из одного элемента), либо в цикле хранить еще и предпоследний (prevK = k; k = ...).

	if (Head->data % 2 == 0) {
			while ((Head->Next != NULL) && ( Head->Next->Next)) {
				k = Head->Next;
				delete k;
				Head->Next = Head->Next;

			}
		}

Ну это сделал, а само условие удаления то.

Так удаление это просто удалить последний и направить Next предпоследнего в нулл.

Выше ж картинка.

1 лайк

Спасибо огромное!
Какой же я тупой!