Загрузка...

Need help with dynamic structure QUEUE C++

Thread in C/C++ created by figs May 5, 2023. 142 views

  1. figs
    figs Topic starter May 5, 2023 0 Dec 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 May 5, 2023 2250 Mar 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 Topic starter May 5, 2023 0 Dec 19, 2022
    не-а, в моменте где мы удаляем все элементы между начальным и конечным, вызвано исключение: нарушение доступа для чтения current было nullptr.
    The post was merged to previous May 5, 2023
    Кто шарит, помогите, все еще нужна помощь.
     
  4. Daemon
    Daemon May 6, 2023 1680 Jan 8, 2021
    Ну так во время их поиска просто ведите счетчик их позиции и начинайте удалять с позиции меньшей до большей.
     
Loading...
Top