Dokar
(Viktor)
18.Апрель.2021 15:06:55
#1
Нужно было создать список вывести его, удалить голову если она нечётная, а если чётная то удалить последний элемент списка и вывести новый список.
#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;
}
AlexP
(Alex P.)
18.Апрель.2021 15:44:26
#2
Так тут вроде бы не в цикле четность проверять надо, а просто проверить четность значения в голове. Если нечетное — удалить её, если четное — удалить хвост.
Ну а само удаление это просто что-то делать с указателями в Next
/ Head
. Рисование списка на листочке может помочь.
Dokar
(Viktor)
18.Апрель.2021 22:44:33
#3
Проблема в том что Head на чётность проверить нельзя ибо Head не целочисленный тип(Int) в этом принципе основная проблема
LiAN
18.Апрель.2021 23:54:26
#4
Тогда можно поиграть в игру “Найди отличия”.
Цель игры:
найти отличия между нумероваными и не нумероваными списками. ))
AlexP
(Alex P.)
19.Апрель.2021 04:43:30
#5
Так я задание понял как
if (Head == nullptr)
{
return;
}
if (Head->data % 2 == 0)
{
...
}
else
{
...
}
Dokar
(Viktor)
19.Апрель.2021 09:08:27
#6
Как то так получилось не знаю где ошибка.
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;
}
}
AlexP
(Alex P.)
19.Апрель.2021 09:23:40
#7
Зачем тут цикл?
Цикл может быть нужен только при поиске хвоста, когда в голове четное.
Выше же примерная структура решения.
Dokar
(Viktor)
19.Апрель.2021 09:32:45
#8
теперь проблема не удаляет последний элемент
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;
}
}
AlexP
(Alex P.)
19.Апрель.2021 09:42:45
#9
Так говорю ж, надо в цикле дойти до конца списка (предпоследнего элемента) и удалить.
При вставке кода надо нажимать кнопку Код .
Dokar
(Viktor)
19.Апрель.2021 09:56:25
#10
if (Head->data % 2 == 0) {
while (Head->Next) {
k = Head->Next;
Head->Next = Head->Next;
}
}
Типа пройти весь список я только так могу, а условие удаления сообразить не могу.
AlexP
(Alex P.)
19.Апрель.2021 10:07:42
#11
Чтобы предпоследний найти надо либо Head->Next->Next
проверять (и еще проверить, что Head->Next
не нулл, на случай списка из одного элемента), либо в цикле хранить еще и предпоследний (prevK = k; k = ...
).
Dokar
(Viktor)
19.Апрель.2021 10:17:44
#12
if (Head->data % 2 == 0) {
while ((Head->Next != NULL) && ( Head->Next->Next)) {
k = Head->Next;
delete k;
Head->Next = Head->Next;
}
}
Ну это сделал, а само условие удаления то.
AlexP
(Alex P.)
19.Апрель.2021 10:20:42
#13
Так удаление это просто удалить последний и направить Next
предпоследнего в нулл.
Выше ж картинка.
1 лайк
Dokar
(Viktor)
19.Апрель.2021 10:29:44
#14
Спасибо огромное!
Какой же я тупой!