Проблема с заменой узлов в двусвязном списке

Я пытаюсь переупорядочить свою DLL по значению int в структуре узла (возраст). Это работает, когда я обращаюсь к 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;

Моя программа скомпилируется и запустит пустой экран. Любое руководство будет оценено. Я предполагаю, что было бы проще просто поменять местами все мои переменные (их не так много), но я хотел сделать свой код чище. благодаря.


person GeorgeCostanza    schedule 15.10.2013    source источник


Ответы (1)


Это потому, что вы на самом деле не связываете узлы повторно, поэтому вы получаете бесконечный цикл. Вам нужно изменить ссылку 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;
person Some programmer dude    schedule 15.10.2013
comment
я предполагаю, что моя первоначальная ссылка потеряла указатели. я пытаюсь добавить предыдущую-›следующую и следующую-›следующую-›предыдущую, как вы сказали, но она все еще пуста. я ненавижу связанные списки - person GeorgeCostanza; 15.10.2013
comment
Хорошо, я почти закончил, но по какой-то причине узлы теряются во время ReOrg. Вот картинка, чтобы показать, что происходит. i.imgur.com/U3BGstr.png Спасибо за ваше время. У меня есть указатели головы и хвоста, указывающие на 1-й и последний узлы. head-›prev и tail-next равны NULL - person GeorgeCostanza; 15.10.2013