Вот код: #include <iostream> using namespace std; struct Spis { int info; Spis* next, * prev; } *begin, * end, * t; void Create_Spis(Spis**, Spis**, int); void Add_Spis(int, Spis**, Spis**, int); void View_Spis(int, Spis*); void Del_All(Spis**); void Remmid(Spis*&); void Create_Spis(Spis** b, Spis** e, int in) { t = new Spis; t->info = in; t->next = t->prev = NULL; *b = *e = t; } void Add_Spis(int kod, Spis** b, Spis** e, int in) { t = new Spis; t->info = in; if (kod == 0) { t->prev = NULL; t->next = *b; (*b)->prev = t; *b = t; } else { t->next = NULL; t->prev = *e; (*e)->next = t; *e = t; } } void View_Spis(int kod, Spis* t) { while (t != NULL) { cout << t->info << endl; switch (kod) { case 0: default: t = t->next; break; case 1: t = t->prev; break; } } } void Del_All(Spis** b) { while (*b != NULL) { t = *b; *b = (*b)->next; delete t; } } void Remmid(Spis*& b) { Spis* min = b; Spis* max = b; Spis* temp = b; while (temp != NULL) { if (temp->info < min->info) { min = temp; } if (temp->info > max->info) { max = temp; } temp = temp->next; } // Если список состоит только из одного элемента, то нечего удалять if (min == max) { return; } // Если минимальный элемент сразу за максимальным, то удаляем только них if (min->next == max) { min->next = max->next; max->next->prev = min; delete max; return; } // Определяем начальный и конечный элементы, которые будут удалены Spis* start = NULL; Spis* end = NULL; if (min->prev == max) { start = min->prev; end = max->next; min->prev = NULL; max->next = NULL; } else if (max->prev == min) { start = max->prev; end = min->next; max->prev = NULL; min->next = NULL; } else { start = min->prev; end = max->next; min->prev = NULL; max->next = NULL; } // Удаляем все элементы между начальным и конечным Spis* current = start; while (current != end) { Spis* next = current->next; delete current; current = next; } // Обновляем указатели на предыдущий и следующий элементы у начального и конечного элементов if (start == NULL) { b = end; } else { start->next = end; } if (end != NULL) { end->prev = start; } } void main() { int i, in, n, kod, kod1; char Str[2][10] = { "Begin ", "End " }; Spis* begin = 0; Spis* end = 0; while (true) { cout << "\n\tCreat - 1\n\tAdd - 2\n\tView - 3\n\tDel - 4\n\tRemoval between max. and min. and the number of deleted items - 5\n\tEXIT - 0 : "; cin >> kod; switch (kod) { case 1: if (begin != NULL) { cout << "Clear Memory!" << endl; break; } cout << "Begin Info = "; cin >> in; Create_Spis(&begin, &end, in); cout << "Creat Begin = " << begin->info << endl; break; case 2: cout << "Info = "; cin >> in; cout << "Add Begin - 0, Add End - 1 : "; cin >> kod1; Add_Spis(kod1, &begin, &end, in); if (kod1 == 0) t = begin; else t = end; cout << "Add to " << Str[kod1] << " " << t->info << endl; break; case 3: if (!begin) { cout << "Spis Pyst!" << endl; break; } cout << "View Begin-0,View End-1:"; cin >> kod1; if (kod1 == 0) { t = begin; cout << "-- Begin --" << endl; } else { t = end; cout << "--- End --" << endl; } View_Spis(kod1, t); break; case 4: Del_All(&begin); cout << "Memory Free!" << endl; break; case 5: cout << "Search for element... "; if (!begin) { cout << "Spis is empty!"; break; } Remmid(begin); break; case 0: if (begin != NULL) Del_All(&begin); return; } } } Мне нужно, чтобы функция Remmid, удаляла элементы между минимальным и максимальным, и с учетом того, что минимальный элемент может стоять как после, так и перед максимальным элементом. На данный момент работает ужасно, хелпаните кто шарит, пожалуйста.
figs, в функции Remmid есть несколько ошибок. Вот исправленный код: void Remmid(Spis*& b) { if (!b || !b->next) { return; // если список пуст или состоит из одного элемента, то нечего удалять } Spis* min = b; Spis* max = b; Spis* temp = b; while (temp != NULL) { if (temp->info < min->info) { min = temp; } if (temp->info > max->info) { max = temp; } temp = temp->next; } // Определяем начальный и конечный элементы, которые будут удалены Spis* start = NULL; Spis* end = NULL; if (min == max) { return; // если минимальный и максимальный элементы совпадают, то нечего удалять } else if (min->prev == max) { start = min->prev; end = max->next; } else if (max->prev == min) { start = min->prev; end = max->next; } else { start = min->next; end = max->prev; } // Удаляем все элементы между начальным и конечным Spis* current = start; while (current != end) { Spis* next = current->next; delete current; current = next; } // Обновляем указатели на предыдущий и следующий элементы у начального и конечного элементов if (start == b) { b = end; } else { start->prev->next = end; } if (end != NULL) { end->prev = start->prev; } } В этом коде я исправил следующие ошибки: - Добавил проверку на то, что список состоит из одного элемента или пуст, чтобы избежать ошибок при обращении к несуществующим элементам. - Исправил определение начального и конечного элементов, которые будут удалены. Теперь они определяются правильно во всех случаях. - Исправил обновление указателей на предыдущий и следующий элементы у начального и конечного элементов. Теперь они обновляются правильно во всех случаях.
не-а, в моменте где мы удаляем все элементы между начальным и конечным, вызвано исключение: нарушение доступа для чтения current было nullptr. --- Сообщение объединено с предыдущим 5 май 2023 Кто шарит, помогите, все еще нужна помощь.
Ну так во время их поиска просто ведите счетчик их позиции и начинайте удалять с позиции меньшей до большей.