0 / 0 / 0
Регистрация: 05.07.2022
Сообщений: 18
1

Функция удаления из списка двух последних элементов

21.10.2022, 20:36. Показов 756. Ответов 13

Author24 — интернет-сервис помощи студентам
Создан список и все работает, кроме функции удаление двух последних ( жёлтым цветом выделено)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
#include <stdio.h>
#include <windows.h>
#include <iostream>
using namespace std;
 
struct data {
int num, year; char name[30],dolgnost[30];};
 
struct list {
struct data inf;
struct list *next;
struct list *pred;
};
 
struct list * del(struct list *beg);
struct data read_data();
struct list * add(struct list * beg, struct data z);
struct list * create_list(struct list * beg);
struct list * del_two_last(struct list * beg);
struct list * add_first(struct list * beg, struct data z);
struct list * add_last(struct list * beg, struct data z);
void print_list(list *beg);
 
int main() {
    SetConsoleCP(65001); 
SetConsoleOutputCP(65001);
struct list *beg,*end,*t;
beg=end=NULL;
int answer;
struct data z;
while (1) {
printf("\n1. создание списка\n"
 "2. добавление в список\n"
 "3. просмотр списка\n"
 "4. удаление\n"
 "5. удаление 2 последних\n"
 "0. выход\n");
printf("\n  Введите- >"),scanf("%d",&answer);
switch (answer) {
case 0:
free (beg);
return 0;
case 1:
beg=create_list(beg);
break;
case 2: {
z=read_data();
beg=add(beg,z);
break;}
case 3:
print_list(beg);
break;
case 4:
beg=del(beg);
break;
case 5:
beg=del_two_last(beg);
break;
default:
printf("Команда не распознана\n");}}}
 
struct data read_data() {
struct data z;
puts("\nВведите:");
printf("\nНомер: ");
scanf("%d", &z.num);
printf("Год поступления на работу: ");
scanf("%d", &z.year);
printf("Имя: ");
scanf("%s", &z.name);
printf("Должность: ");
scanf("%s", &z.dolgnost);
return z;
}
 
struct list * add(struct list * beg, struct data z) {
list *t, *end;
t=(struct list *)malloc(sizeof(struct list));
t->inf=z;
t->next=NULL;
if (beg==NULL)
beg=t;
else {
end=beg;
for(; end->next!=NULL; end=end->next);
end->next=t;
}
return beg;
}
 
 
struct list * add_first(struct list * beg, struct data z) {
list *t;
t=(struct list *)malloc(sizeof(struct list));
t->inf=z;
t->next=beg;
beg=t;
return beg;
}
 
struct list * add_last(struct list * beg, struct data z) {
list *t, *end;
t=(struct list *)malloc(sizeof(struct list));
t->inf=z;
t->next=NULL;
if (beg==NULL)
beg=t;
else {
end=beg;
for(; end->next!=NULL; end=end->next);
end->next=t;
}
return beg;
}
 
 
 
 
struct list * create_list(struct list * beg) {
int fl=0;
struct data z;
do {
if (beg==NULL) {
z=read_data();
beg=add_first(beg,z);
} else { 
z=read_data();
add_last(beg,z);
}
printf("еще 1-да 0-нет");
scanf("%d",&fl);
} while(fl);
return beg;
}
 
void print_list(list *beg) {
list *t;
if (beg==NULL) { 
printf("\nсписок пуст\n");
Sleep(1000);
return;
}
printf("___________________________________________________\n");
printf("\n| Номер |    Имя    | Год поступления | Должность |\n");
t=beg;
while (t!=NULL) {
printf("|%7d| %9s | %15d | %10s|\n", t->inf.num,t->inf.name,t->inf.year,t->inf.dolgnost);
t=t->next;
}
printf("___________________________________________________\n");
Sleep(1000);
return;
}
 
[COLOR="Yellow"]struct list * del_two_last(struct list *beg) {
if (beg==NULL) {
printf("список пуст");
return 0;}
  else if(beg->next->next==NULL) {
    free(beg->next);
    free(beg);
    cout << "Element deleted!\n";
  }
return beg;
}[/COLOR]
 
struct list* del(struct list* beg) {
list* t = beg;
list* del = beg;
if (beg) {
int temp;
cout<< " Введиет пор. номер удаляемого элемента : ";
cin>> temp;
 
if (temp == 1) {
del = beg->next;
beg->next = beg->next->next;
free(del);
}
else {
for (int i = 1; i < temp; i++) {
if (del->next != NULL) {
t = del;
del = del->next;
}
else {
cout << "/nБудет произведено удаление последнего элемента!/n";
}}
t->next = t->next->next;
free(del);
}}
else printf("список пуст");
return beg;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
21.10.2022, 20:36
Ответы с готовыми решениями:

Функция, возвращающая список состоящий из элементов данного списка + n последних элементов списка
определить функцию принимающую в качестве параметров список символов и число и возвращающую в...

Определить, равна ли сумма двух первых элементов заданного списка сумме двух его последних элементов
Собственно, сабж: надо на lisp/scheme, и, желательно, как оформить это отдельно в виде макроса. Я...

Сравнить суммы двух первых и двух последних элементов списка
Нужно определить, равны ли эти суммы...

Однонаправленый список. Функция удаления с конца списка, вставка и удаления из середины списка(код внутри)
Вот мой рабочий код, только не могу еще три функции дописать, которые удаляют из сконца списка,...

Удаление первого и двух последних элементов списка
Привет всем!Только начала изучать пролог,вроде получается,но вот с этими задачами не...

13
Комп_Оратор)
Эксперт по математике/физике
8949 / 4703 / 629
Регистрация: 04.12.2011
Сообщений: 13,999
Записей в блоге: 16
21.10.2022, 23:03 2
WhiteSeal, вам удалось сотворить слово-паразит из ключевого слова struct. Уберите его отовсюду откуда сможете. Уже это, продвинет вас к свету и теплу.
1
Модератор
Эксперт функциональных языков программированияЭксперт Python
36587 / 20317 / 4218
Регистрация: 12.02.2012
Сообщений: 33,616
Записей в блоге: 13
21.10.2022, 23:17 3
Цитата Сообщение от IGPIGP Посмотреть сообщение
Уберите его отовсюду откуда сможете. Уже это, продвинет вас к свету и теплу.
- да и отформатировать по-человечески не помешает...
1
2817 / 2325 / 703
Регистрация: 29.06.2020
Сообщений: 8,577
21.10.2022, 23:39 4
Цитата Сообщение от IGPIGP Посмотреть сообщение
Уже это, продвинет вас к свету и теплу.
Еще ближе продвинет к свету понимание указателей.
0
Комп_Оратор)
Эксперт по математике/физике
8949 / 4703 / 629
Регистрация: 04.12.2011
Сообщений: 13,999
Записей в блоге: 16
21.10.2022, 23:58 5
Цитата Сообщение от SmallEvil Посмотреть сообщение
Еще ближе продвинет к свету понимание указателей.
Это зависит от того, куда они покажут!
0
0 / 0 / 0
Регистрация: 05.07.2022
Сообщений: 18
22.10.2022, 01:25  [ТС] 6
У меня задача такая в институте и мне надо сделать это таким образом, как я писал выше. Мне приятно слышать советы и рекомендации, но мне нужно другое
0
Комп_Оратор)
Эксперт по математике/физике
8949 / 4703 / 629
Регистрация: 04.12.2011
Сообщений: 13,999
Записей в блоге: 16
22.10.2022, 01:47 7
WhiteSeal, тогда нужно не цветотегами левыми, форматировать, а оставлять тот код что нужно показать, а функцию так и называть как она в исходном коде прописана. Вдумайтесь-ка, что вот тут происходит:
C++
1
2
3
4
5
6
7
8
9
10
11
 struct list * del_two_last(struct list *beg) {
if (beg==NULL) {
printf("список пуст");
return 0;}
  else if(beg->next->next==NULL) {
    free(beg->next);
    free(beg);
    cout << "Element deleted!\n";
  }
return beg;
}
?
Тут даже нет попытки пройти по списку в цикле. Ну вроде того, что:
C++
1
2
3
4
5
6
7
auto prev=begin;
while (begin->next )
{
prev=begin;
begin=next;
}
//begin - последний элемент - удаляем, а prev устанавливаем в ноль
Так получится функция удаляющая один хвостовой. А потом клиентский код может удалить столько сколько ему нужно. Что за блажь удалять попарно? При желании можете написать функцию которая удаляет n штук вызывая данную. Можете, её оптимизировать так, что бы она не вызывалась лишние разы, если заказано больше чем есть в наличии. (подсказка - пусть функция удаляющая одну штуку возвращает указатель конечного значимого элемента, -что бы не бегать каждый раз. И чтобы выскочить раньше если она ноль вернула) .
0
4063 / 3317 / 924
Регистрация: 25.03.2012
Сообщений: 12,483
Записей в блоге: 1
22.10.2022, 01:53 8
IGPIGP, это просто использование struct в стиле Си, а не С++
0
0 / 0 / 0
Регистрация: 05.07.2022
Сообщений: 18
22.10.2022, 04:13  [ТС] 9
Я не знаю, как правильно это написать. Да и к тому же надо сделать проверку ведь, если список будет состоять из 1 невозможно удалить 2, собственно поэтому написал на форум.

Добавлено через 46 минут
максимально приближено получилось, но появилась проблема то, что я освободил, заполнилось рандомными значениями и я до сих пор не понял, как сделать проверку на то, что в списке больше 1
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
struct list* del_two_last(struct list* beg) {
 
list* t = beg;
list* del = beg;
if(beg){
while (del->next->next != NULL) {
del = del->next;
}
t=del;
del=del->next;
free(del);
free(t);}
else printf("список пуст");
return beg;
}
0
Комп_Оратор)
Эксперт по математике/физике
8949 / 4703 / 629
Регистрация: 04.12.2011
Сообщений: 13,999
Записей в блоге: 16
22.10.2022, 09:11 10
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
IGPIGP, это просто использование struct в стиле Си, а не С++
Kuzia domovenok, я в курсе, но тут C++, а значит тепло и свет по определению данного раздела именно здесь. Как же не трольнуть? Тем более, что по смыслу - писать С код на плюсах, это боль. Я остаюсь при своём мнении)
0
Комп_Оратор)
Эксперт по математике/физике
8949 / 4703 / 629
Регистрация: 04.12.2011
Сообщений: 13,999
Записей в блоге: 16
22.10.2022, 09:16 11
Цитата Сообщение от WhiteSeal Посмотреть сообщение
C++
1
2
free(del);
free(t);}
t не нужно удалять. Его указатель на next нужно обнулить, чтобы хвост не отвалился.
0
0 / 0 / 0
Регистрация: 05.07.2022
Сообщений: 18
22.10.2022, 12:28  [ТС] 12
а как тогда удалить 2 элемента?
0
0 / 0 / 0
Регистрация: 05.07.2022
Сообщений: 18
24.10.2022, 09:32  [ТС] 13
если вдруг кому понадобиться, вот
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
struct list* del_two_last(struct list* beg) {
 
list* t = beg;
list* del = beg;
list* s = beg;
if(beg){
while (del->next->next->next != NULL) {
del = del->next;
}
t=del;
del=del->next;
s=del;
del=del->next;
free(del);
s->next = NULL;
free(s);
t->next = NULL;
}
else printf("список пуст");
return beg;
}
0
Комп_Оратор)
Эксперт по математике/физике
8949 / 4703 / 629
Регистрация: 04.12.2011
Сообщений: 13,999
Записей в блоге: 16
24.10.2022, 11:17 14
М-да. Перечитайте, что вам написано и подумайте над тем, что вы пишете.
Цитата Сообщение от WhiteSeal Посмотреть сообщение
если вдруг кому понадобиться, вот
Боже упаси.
0
24.10.2022, 11:17
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.10.2022, 11:17
Помогаю со студенческими работами здесь

Функция удаления элементов из списка
Функция начиная с конца списка удаляет элементы больше заданного(s_a). Все работает, но когда...

Составьте отношение для выделения двух последних элементов из списка
Привет всем!Помогите,пожалуйста, решить 2 задачи!Спасибо! 1.Составьте отношение для выделения двух...

Функция удаления чётных элементов двусвязного списка
bool delete_even(circle_list *&amp;list) {circle_list *curr=list, *first=list; *temp=NULL; if...

Функция удаления двух элементов из массива
Ребят, нужно написать функцию удаления двух элементов. Вот что уже есть. Суть: ввел элементы;...

C++ Функция удаления элементов из списка в динамической структуре данных
Доброго времени суток! У меня возникла проблема с удалением элементов из списка. Имеется функция...

Функция удаления из списка всех элементов между минимальным и максимальным числом
Здравствуйте! Помогите написать функцию удаления всех элементов между минимальным и максимальным...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru