Я пытаюсь изменить порядок моей DLL на значение int внутри узла struct (age). Он работает, когда я напрямую обращаюсь к int, но я пытаюсь обменивать все узлы, чтобы мне не пришлось менять каждую переменную в структуре, когда список переупорядочивается.
void DLL::ReOrg(node* head, int DLL_Size)
{
node* temp = head;
int holder;
for(int j = 0; j < DLL_Size; j++)
{
while(temp != NULL)
{
if (temp->next != NULL && (temp->age < temp->next->age) )
{
holder = temp->age;
temp->age = temp->next->age;
temp->next->age = holder;
}
else
temp = temp->next;//increment node
}
temp = head;
}
}
Это работает, но когда я пытаюсь сделать что-то вроде:
node* holder;
...
holder = temp;
temp = temp->next;
temp->next = holder;
Моя программа будет компилировать и запускать пустой экран. Любые рекомендации будут оценены. Я предполагаю, что было бы проще просто поменять все мои переменные (их немного), но я хотел сделать мой код более чистым. Благодарю.
Это потому, что вы на самом деле не перенацеливаете узлы, поэтому вы получаете бесконечный цикл. Вам нужно изменить next
ссылку предыдущего узла, а также ссылку prev
на следующем следующем узле.
Если ваш список дважды связан, и у вас есть предыдущий указатель и следующий указатель, вы можете сделать что-то вроде этого:
node* next = temp->next;
// Fix the links of the previous node, and the next-next node
if (temp->prev)
temp->prev->next = next;
if (next->next)
next->next->prev = temp;
// Relink the two nodes that should be swapped
temp->next = next->next;
next->next = temp;
next->prev = temp->prev;
temp->prev = next;