Реверсивный круговой настил без часового - PullRequest
2 голосов
/ 01 мая 2010

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

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 ]

2 голосов
/ 01 мая 2010

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

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

1 голос
/ 01 мая 2010

Не прямой ответ на вашу проблему, но в школе я обнаружил, что Отладчик отображения данных незаменим для устранения подобных проблем.

1 голос
/ 01 мая 2010
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.

0 голосов
/ 01 мая 2010

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

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

...