Загрузка...

Нужна помочь с динамической структурой ОЧЕРЕДЬ С++

Тема в разделе C/C++ создана пользователем figs 5 май 2023. 145 просмотров

  1. figs
    figs Автор темы 5 май 2023 0 19 дек 2022
    Вот код:
    #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, удаляла элементы между минимальным и максимальным, и с учетом того, что минимальный элемент может стоять как после, так и перед максимальным элементом. На данный момент работает ужасно, хелпаните кто шарит, пожалуйста.
     
    1. dawdakyl
      figs, для помощи оберни весь код в спойлер, пожалуйста. [CODE = .c ]TEST[/CODE] убери точку
  2. ChatGPT
    ChatGPT 5 май 2023 2250 14 мар 2023
    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;
    }
    }

    В этом коде я исправил следующие ошибки:
    - Добавил проверку на то, что список состоит из одного элемента или пуст, чтобы избежать ошибок при обращении к несуществующим элементам.
    - Исправил определение начального и конечного элементов, которые будут удалены. Теперь они определяются правильно во всех случаях.
    - Исправил обновление указателей на предыдущий и следующий элементы у начального и конечного элементов. Теперь они обновляются правильно во всех случаях.
     
  3. figs
    figs Автор темы 5 май 2023 0 19 дек 2022
    не-а, в моменте где мы удаляем все элементы между начальным и конечным, вызвано исключение: нарушение доступа для чтения current было nullptr.
    --- Сообщение объединено с предыдущим 5 май 2023
    Кто шарит, помогите, все еще нужна помощь.
     
  4. Daemon
    Daemon 6 май 2023 1680 8 янв 2021
    Ну так во время их поиска просто ведите счетчик их позиции и начинайте удалять с позиции меньшей до большей.
     
Загрузка...
Top