GOOGLE ADS

среда, 13 апреля 2022 г.

Как реализовать удаление элементов с четными номерами из созданного стека?

Как реализовать удаление элементов с четными номерами из созданного стека? Вот код. Я пока плохо разбираюсь в этой теме. Прошу помощи. Мне нужно реализовать удаление элементов с четными номерами из созданного стека в функции DelEven(). Как это сделать я не знаю. Может ли кто-нибудь помочь с этим? Теперь после вызова функции DelEven вместо списка остаются 0 и 1

#include <iostream>
#include <stdlib.h>
using namespace std;
struct Stack {
int info;
Stack * next;
} *beg, *t;
Stack* InStack(Stack*, int);
void View(Stack*);
void Del_All(Stack **);
void Sort_p(Stack **);
void Sort_info(Stack *);
Stack* DelEven(Stack *);
int main(int argc, char* argv[]){
int i, in, n, kod;
while(true){
cout << "\n\tCreat - 1.\tAdd - 2.\tView - 3.\tDel - 4.\tSort1 - 5.\tSort2 - 6.\tInd_zad - 7.\tEXIT - 0.: ";
cin >> kod;
switch(kod) {
case 1: case 2:
if(kod == 1 && beg!= NULL){
cout << "Clear Memory!" << endl;
break;
}
cout << "Input kol = "; cin >> n;
for(i = 1; i <= n; i++) {
in = rand();
beg = InStack(beg, in); }
if (kod == 1) cout << "Create " << n << endl;
else cout << "Add " << n << endl;
break;
case 3: if(!beg){
cout << "Stack Pyst!" << endl;
break; }
cout << "--- Stack ---" << endl;
View(beg);
break;
case 4:
Del_All(&beg);
cout<<"Memory Free!"<<endl;
break;
case 5:
if(beg!= NULL) Sort_p(&beg);
break;
case 6:
if(beg!= NULL) Sort_info(beg);
break;
case 7:
if(beg!= NULL) DelEven(beg);
break;
case 0:
if(beg!= NULL)
Del_All(&beg); } }}
Stack* InStack(Stack *p, int in) {
Stack *t = new Stack;
t -> info = in;
t -> next = p;
return t;}
void View(Stack *p)
{
int c;
Stack *t = p;
while( t!= NULL) {
c = t->info;
cout<<" "<<c<<endl;
t = t -> next; }}
void Del_All(Stack **p) {
while(*p!= NULL) {
t = *p;
*p = (*p) -> next;
delete t; }}
void Sort_p(Stack **p) {
Stack *t = NULL, *t1, *r;
if ((*p) -> next -> next == NULL) return;
do {
for (t1=*p; t1-> next->next!= t; t1=t1-> next)
if (t1->next->info > t1-> next-> next-> info){
r = t1->next->next;
t1 -> next -> next = r -> next;
r-> next =t1-> next;
t1-> next = r; }
t= t1-> next;
} while ((*p)-> next -> next!= t);}
void Sort_info(Stack *p) {
Stack *t = NULL, *t1;
int r;
do {
for (t1=p; t1 -> next!= t; t1 = t1-> next)
if (t1-> info > t1-> next -> info) {
r = t1-> info;
t1-> info = t1-> next -> info;
t1-> next -> info = r; }
t = t1; } while (p -> next!= t);}
Stack* DelEven(Stack *p) {
Stack* t = p;
Stack* t1 = p;
while (t!= NULL) {
if (t->info % 2!= 0) {
t1 = t;
t = t->next; }
else {
if (t == p) {
p = p->next;
delete t;
return p; }
else {
t1->next = t->next;
delete t;
t = t1->next; }} }}


Решение проблемы

Вы можете извлечь все элементы из исходного стека один за другим и добавить те, которые хотите сохранить, в новый (временный) стек.

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

Хотя приведенное выше решение является «правильным» и общим способом решения такой проблемы с общими стеками, поскольку у вас есть контроль над реализацией, вы можете рассматривать его как простой простой (один) связанный список.

Таким образом, вы можете сделать ярлык, просто перебирая список, удаляя элементы по мере необходимости.

Вам нужно обработать особый случай, когда голова списка (верхняя часть стека) является узлом, который вам нужно удалить. Помимо этого вам нужно отслеживать предыдущий узел, так как вам нужно изменить его nextуказатель.

Комментариев нет:

Отправить комментарий

Laravel Datatable addColumn returns ID of one record only

Я пытаюсь использовать Yajra Datatable для интеграции DataTable на свой веб-сайт. Я смог отобразить таблицу, но столкнулся с проблемой. В по...