Реверсивный круговой настил без часового

Эй, Stackru Я работаю над своим домашним заданием и пытаюсь перевернуть круговую связку без часового. Вот мои структуры данных:

struct DLink {

 TYPE value;

 struct DLink * next;

 struct DLink * prev;
};

struct cirListDeque {

 int size;
 struct DLink *back;
};

Вот мой подход к обращению обратного хода:

void reverseCirListDeque(struct cirListDeque* q) {

struct DLink* current;

struct DLink* temp;



temp = q->back->next;

q->back->next = q->back->prev;

q->back->prev = temp;



current = q->back->next;

while(current != q->back) {

    temp = current->next;

    current->next = current->prev;

    current->prev = temp;



    current = current->next;

}

}

Однако, когда я запускаю его и помещаю в него значения 1, 2 и 3 (TYPE - просто псевдоним для int в этом случае) и меняю его, я получаю 2, 1, 3. Есть ли у кого-нибудь какие-либо идеи относительно того, что я могу делать неправильно?

Заранее спасибо.

4 ответа

Решение
current = q->back->next;

while(current != q->back->next)
{
    /* This code will never run, cause you guaranteed right before the while
     * that current == q->back->next .
     */
}

Обновление: то, что вам нужно сделать сейчас, после того, как вы изменили все указатели (что, кажется, работает сейчас, судя по вашим результатам), устанавливает указатель "назад" на back->prev.

Всякий раз, когда вы работаете с абстрактными типами данных - списками, очередями, запросами и т. Д., Когда задействованы указатели, это действительно помогает нарисовать вашу структуру данных и ее указатели в виде диаграммы на бумаге. Маркируйте все. Затем закодируйте то, что вы видите. Это действительно делает это намного проще. Я не использовал deques со времен колледжа, но убедитесь, что вы не путаете prev, next и back, так как это может быть проблемой. Также не забудьте проверить нулевые указатели, прежде чем разыменовывать их.

Надеюсь, это поможет без непосредственного раздачи ответа. Ваш профессор может оценить это.;-)

Не прямой ответ на вашу проблему, но, вернувшись в школу, я обнаружил, что Data Display Debugger незаменим для устранения таких проблем, как эта.

Самый простой и быстрый способ сделать это - изменить только интерпретацию направления очереди.

Направление будет сохранено в cirListDeque, и ваше перемещение от узла к узлу будет выполняться с учетом текущего направления очереди.

Другие вопросы по тегам