Реверсивный круговой настил без часового
Эй, 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, и ваше перемещение от узла к узлу будет выполняться с учетом текущего направления очереди.