Поменять двусвязный список

0

Хорошо.

Поэтому я пытался реализовать двусвязный список с функцией swap.

Я нашел много сайтов в Интернете, которые объясняют, как это сделать - и почти во всех из них (в том числе несколько из Stack Overflow) аргумент начинается с комментариев о правильности реализации. Я попробовал несколько из них безрезультатно. Другими словами, я не могу найти ни одной окончательной версии этого алгоритма.

Я пробовал по крайней мере 4-5 различных алгоритмов из тех, что я нашел в Интернете, а также несколько, которые я пытался разобраться, но у меня все время возникают проблемы с сортировкой элементов неправильно. Я полностью в своем уме.

Вот самая последняя версия, которую я пробовал, которая не работает:

template <typename T>
void PriorityQueue<T>::swap(Node * n1, Node * n2){
    if(n1 == n2)
        return;
    if(n1 == 0 || n2 == 0){
        std::cout << "\nPRIORITYQUEUE ERROR: Trying to swap with non-existent node\n";
        return;
    }

    Node * temp = new Node;

    temp->prev = n1->prev;
    temp->next = n1->next;

    n1->prev = n2->prev;
    n1->next = n2->next;

    n2->prev = temp->prev;
    n2->next = temp->next;

    if(n1->next != 0)
        n1->next->prev = n2;
    if(n1->prev != 0)
        n1->prev->next = n2;
    if(n2->next != 0)
        n2->next->prev = n1;
    if(n2->prev != 0)
        n2->prev->next = n1;

    delete temp;

}

Я разочарован. Пожалуйста, помогите мне, показывая мне полный рабочий алгоритм. Не ссылаясь на страницу со сломанным алгоритмом и комментарии о том, как ее исправить (что я пробовал несколько раз сейчас), а просто алгоритм. Ему даже не нужен код, просто алгоритм. Пожалуйста. Я так устал от попыток исправить это и так позади графика по этому проекту, и я буду так вечно благодарен, если кто-то там определенно поможет мне разобраться в этом раз и навсегда.

  • 1
    Ваш класс содержит только указатели и, возможно, int для информации о размере, верно? Просто поменяйте местами эти значения.
  • 0
    Привет, Нил. Думаю, это то, что я пытаюсь сделать здесь. Однако я должен присваивать значения в неправильном порядке или что-то в этом роде, потому что, когда я печатаю отсортированные элементы, они совершенно не в порядке - и фактически это вызывает ошибки.
Показать ещё 3 комментария
Теги:
sorting
doubly-linked-list
nodes
swap

1 ответ

0

Ваша проблема в последних строках. Я исправил их:

if(n1->next != 0)
    n1->next->prev = n1; // n2;
if(n1->prev != 0)
    n1->prev->next = n1; // n2;
if(n2->next != 0)
    n2->next->prev = n2; // n1;
if(n2->prev != 0)
    n2->prev->next = n2; // n1;

В начале функции у вас есть два узла n1 и n2 с указателями на другие элементы n1p, n1n, n2p, n2n.

<-| p |  <-| p |  <-| p |
  |n1p|    | n1|    |n1n|
  | n |->  | n |->  | n |->

<-| p |  <-| p |  <-| p |
  |n2p|    | n2|    |n2n|
  | n |->  | n |->  | n |-> 

В первой части с переменной temp вы указываете указатели узлов n1 и n2. Итак, вы приходите в такую ситуацию.

<-| p |  <-| p |  <-| p |
  |n1p|    | n2|    |n1n|
  | n |->  | n |->  | n |->

<-| p |  <-| p |  <-| p |
  |n2p|    | n1|    |n2n|
  | n |->  | n |->  | n |->

И проблема была в том, что вы неправильно меняете указатели на n1p, n1n, n2p и n2n. Взгляните на пример с укорененным классом Node и с коррекционной функцией swap.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню