Хорошо.
Поэтому я пытался реализовать двусвязный список с функцией 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;
}
Я разочарован. Пожалуйста, помогите мне, показывая мне полный рабочий алгоритм. Не ссылаясь на страницу со сломанным алгоритмом и комментарии о том, как ее исправить (что я пробовал несколько раз сейчас), а просто алгоритм. Ему даже не нужен код, просто алгоритм. Пожалуйста. Я так устал от попыток исправить это и так позади графика по этому проекту, и я буду так вечно благодарен, если кто-то там определенно поможет мне разобраться в этом раз и навсегда.
Ваша проблема в последних строках. Я исправил их:
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
.