Вот код: #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. The post was merged to previous May 5, 2023 Кто шарит, помогите, все еще нужна помощь.
Ну так во время их поиска просто ведите счетчик их позиции и начинайте удалять с позиции меньшей до большей.