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。有没有人有任何关于我的想法可能做错了?
提前致谢。
答案 0 :(得分:2)
每当使用抽象数据类型 - 列表,队列,deques等时,无论何时涉及指针,它都有助于将您的数据结构及其指针绘制到纸上的图表中。标记一切。然后编码你看到的内容。它真的让它变得容易多了。我从大学开始就没有使用过deques,但要确保你不会混淆prev,next和back,因为这可能是问题所在。还要确保在解除引用之前检查空指针。
希望这有助于不直接泄露答案。你的教授可能会很感激。 ; - )
答案 1 :(得分:1)
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 .
*/
}
更新:你现在需要做什么,一旦你扭转了所有的指针(现在似乎工作,根据你的结果判断),将你的“后退”指针设置为返回 - > prev。
答案 2 :(得分:1)
不能直接回答你的问题,但回到学校后,我发现Data Display Debugger对于调试此类问题非常宝贵。
答案 3 :(得分:0)
最简单快捷的方法是只改变对队列方向的解释。
方向将存储在cirListDeque中,您从节点到节点的移动将在知道队列当前方向的情况下完成。