Обычно помогает визуализировать ссылки в двусвязном списке, просто нарисуйте его на листе бумаги.Вы заметите 4 ссылки на узел:
node->next
node->next->prev
node->prev
node->prev->next
Таким образом, чтобы поменять местами два несвязанных узла, вам нужно поменять 4 ссылки.
Следующее не будет работать:
node1->next=node2->next;
Это перезаписывает старое значение node1-> next
.Вам нужно использовать временную переменную вместо этого.Примерно так:
#define SWAP_PTR(a,b) { void* tmp = b; b = a; a = tmp; }
void swap_node(punt node1, punt node2)
{
SWAP_PTR(node1->next, node2->next);
SWAP_PTR(node1->next->prev, node2->next->prev);
SWAP_PTR(node1->prev, node2->prev);
SWAP_PTR(node1->prev->next, node2->prev->next);
}
Примечание - в многопоточной среде вам понадобится некоторая форма блокировки.