Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 31.03.2022, 18:08   #1
Zgrd60
 
Регистрация: 31.03.2022
Сообщений: 5
Восклицание Помогите доработать код. Нужно удалить каждый второй элемент из циклического двухсвязного списка.

Помогите найти ошибку, постоянно удаляет не то, что нужно, на данный момент выбивает ошибку. Буду благодарен!
Код:
struct list {
int data;
list *pNext;
};
 
void deleteItems(list *pStart, int k) {
list *tmp;
list *curr = pStart; // Текущий элемент списка
while( curr ) // Проходим по списку
{
    if( curr->data % 2 == 0 )  // Если элемент четный
    {
        list *tmp = curr->pNext; // удаляемый элемент
        curr->pNext = tmp->pNext; 
 
        delete tmp;
    }
 
    curr = curr->pNext;
}
}
Zgrd60 вне форума Ответить с цитированием
Старый 31.03.2022, 21:24   #2
maks1331
Форумчанин
 
Аватар для maks1331
 
Регистрация: 20.12.2016
Сообщений: 270
По умолчанию

Как в коде, удаляет каждый четный

Код:
#include <iostream>
#include <vector>

using namespace std;

struct List {
    int data;
    List* next = nullptr;
};

List* DeleteEvens(List* list)
{
    List* prew = nullptr;
    auto* start = list;
    while (list) {
        if (list->data % 2 == 0 && list->data != 0) {
            if (prew == nullptr) {
                auto* current = list;
                list = list->next;
                start = list;
                delete current;
            }
            else {
                prew->next = list->next;
                delete list;
                list = prew;
            }
        }
        prew = list;
        list = list->next;
    }
    return start;
}

void FillList(List* list, const vector<int>& data = { 66, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 15, 17, 14, 16, 18, 0, 22, 44 })
{
    List* prew = nullptr;
    for (auto current = data.begin(); current != data.end(); ++current) {
        prew = list;
        list->data = *current;
        list->next = new List;
        list = list->next;
    }
    delete list;
    list = prew;
    list->next = nullptr;
}

void PrintList(List* list)
{
    while (list) {
        cout << list->data << " ";
        list = list->next;
    }
    cout << endl;
}

bool CheckResult(List* list, const vector<int>& data = { 1, 3, 5, 7, 9, 11, 13, 15, 17, 0 })
{
    if (list == nullptr && !data.empty()) {
        return false;
    }
    for (auto current = data.begin(); current != data.end(); ++current) {
        if (list == nullptr || *current != list->data) {
            return false;
        }
        list = list->next;
    }
    return true;
}

int main()
{
    List* list = new List;
    FillList(list);
    cout << "Before: ";
    PrintList(list);
    list = DeleteEvens(list);
    cout << "After : ";
    PrintList(list);

    cout << "\nTest status is: " << (CheckResult(list) ? "success" : "fail") << "!" << endl;

    cout << "\nEnter any button...";

    cin.clear();
    cin.ignore(32767, '\n');
    cin.get();

    return 0;
}
формошлеп.рф
witech.su

Последний раз редактировалось maks1331; 31.03.2022 в 21:48.
maks1331 вне форума Ответить с цитированием
Старый 01.04.2022, 18:06   #3
Zgrd60
 
Регистрация: 31.03.2022
Сообщений: 5
Вопрос

Можете помочь с кодом, который удаляет каждый второй элемент
Zgrd60 вне форума Ответить с цитированием
Старый 01.04.2022, 21:24   #4
maks1331
Форумчанин
 
Аватар для maks1331
 
Регистрация: 20.12.2016
Сообщений: 270
По умолчанию

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

Что такое условие знаешь? Где оно тут в коде?
формошлеп.рф
witech.su
maks1331 вне форума Ответить с цитированием
Старый 01.04.2022, 22:12   #5
Zgrd60
 
Регистрация: 31.03.2022
Сообщений: 5
Восклицание Подскажите как доработать код. Нужно удалить каждый второй элемент из циклического двухсвязного списка

Помогите переписать функцию Del, чтобы удалялся каждый второй элемент из циклического двухсвязного списка. Очень прошу помощи!!!!
Код:
 Удаление из двусвязного списка
#include <iostream>
using namespace std;
 
class MyList {                                       //Список MyList
    int x, count_;
    MyList* Head, * Tail, * Next, * Prev;
public:
    MyList() :count_(0), Head(NULL), Tail(NULL) {};     //Инициализация с помощью конструктора по умолчанию
    void Add(int);
    void Show();
    void Del(int);                                  //Функция принимает целочисленный параметр, обозначающий номер удаляемого элемента
    ~MyList();
};
 
/*ДОБАВЛЕНИЕ ЭЛЕМЕНТА В СПИСОК*/
void MyList::Add(int x) {
    MyList* temp = new MyList;
    temp->x = x;
    temp->Next = NULL;
    count_++;
    if (!Head) {
        temp->Prev = NULL;
        Head = temp;
        Tail = Head;
    }
    else {
        temp->Prev = Tail;                  //Указываем, что предыдущим элементом списка относительно добавленного, будет последний элемент существующего списка
        Tail->Next = temp;                  //Следующий за последним существующим это непосредственно сейчас добавляемый элемент списка
        Tail = temp;                        //После того как указали что есть настоящий и что предыдущий, объявляем, что последний существующий это только что добавленный элемент
    }
}
 
/*ПОКАЗЫВАЕТ СПИСОК НА ЭКРАНЕ*/
void MyList::Show() {
    MyList* t = Head;
    while (t) {
        cout << t->x << " ";
        t = t->Next;
    }
    cout << "\n\n";
}
 
 
/*ФУНКЦИЯ УДАЛЕНИЯ КОНКРЕТНОГО ЭЛЕМЕНТА ДВУСВЯЗНОГО СПИСКА*/
void MyList::Del(int x) {
    //Если удаляем первый элемент, то могут быть такие варианты
    //В списке есть только первый, в списке есть несколько элементов
    //Поэтому разбиваем логику выполнения
    if ((x == 1) and (Head->Next)) {                     //Если удаляем первый, но есть и другие, то
        MyList* temp = Head;                            //Указываем, что нам нужно начало списка
        Head = Head->Next;                              //Сдвигаем начало на следующий за началом элемент
        Head->Prev = NULL;                              //Делаем так, чтоб предыдущий началу элемент был пустым
        delete temp;                                    //Удаляем удаляемое начало
        count_--;                                       //Обязательно уменьшаем счетчик
        return;                                     //И выходим из функции
    }
    else if ((x == 1) and (Head == Tail)) {            //Если удаляем первый, но в списке только 1 элемент
 
        Head->Next = NULL;                              //обнуляем все что нужно
        Head = NULL;
        delete Head;                                    //Удаляем указатель на начало
        count_ = 0;                                     //Обязательно обозначаем, что в списке ноль элементов
        return;                                         //и выходим из функции
    }
 
    //Также может быть, что удаляемый элемент является последним элементом списка
    if (x == count_) {
        MyList* temp = Tail;                                //Указываем, что нам нужен хвост
        Tail = Tail->Prev;                                  //Отодвигаем хвост немного назад
        Tail->Next = NULL;                                  //Обозначаем, что впереди за хвостом пусто
        delete temp;                                        //Очищаем память от бывшего хвоста
        count_--;                                           //Обязательно уменьшаем счетчик элементов
        return;                                         //И выходим из функции
    }
 
    //Если же удаляемый элемент лежит где-то в середине списка, то тогда его можно удалить
 
    MyList* temp = Head, * temp2;                        //temp-Удаляемый элемент, temp2 нужен, чтобы не потерять данные
 
        //cout<<count_<<"\n";
    for (int i = 0; i < x - 1; i++) temp = temp->Next;  //Идем к адресу удаляемого элемента
 
    temp2 = temp;                                   //Временно запоминаем адрес удаляемого элемента
    temp2->Prev->Next = temp->Next;             //Записываем данные, что следующий за перед сейчас удаляемым элементом - это следующий от удаляемого
    temp2->Next->Prev = temp->Prev;               //а предыдущий для следующего - это предыдущий для удаляемого
    delete temp;                               //теперь смело можно освободить память, удалив адрес на начало удаляемого элемента
    count_--;                                         //Обязательно уменьшаем число элементов в списке.
}
 
 
/*ДЕСТРУКТОР ДЛЯ КОРРЕКТНОГО ВЫСВОБОЖДЕНИЯ ПАМЯТИ*/
MyList::~MyList() {
    //   cout<<"\nDELETES\n";
    while (Head) {
        // cout<<"Del is: "<<Head->x<<"  ";
        Tail = Head->Next;
        delete Head;
        Head = Tail;
    }
}
 
 
int main() {
    MyList List1;
    List1.Add(10);
    List1.Add(20);
    List1.Add(30);
    List1.Add(40);
    List1.Add(50);
    List1.Show();
    List1.Del(2);
    List1.Show();
}
Zgrd60 вне форума Ответить с цитированием
Старый 01.04.2022, 22:45   #6
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Объединил темы, так как вопрос остался прежним. Может стоит разобраться в коде, а не просто выкладывать чужой код 2012 года?
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Реализовать «сжатие» исходной последовательности, выбрасывая из неё каждый второй элемент Сельский Житель Visual C++ 0 18.09.2018 15:03
Двусвязные списки, удалить каждый второй элемент С++ Дана188 Помощь студентам 0 18.11.2014 15:06
задан массив размером N. вывести на печать каждый второй элемент массива Сергей505 Паскаль, Turbo Pascal, PascalABC.NET 4 14.12.2011 17:37
Чем отличается Дек от Двухсвязного списка? vampik Помощь студентам 2 17.05.2011 16:55
помогите удалить элемент из связанного списка kermit Помощь студентам 5 13.06.2008 10:14