在没有哨兵的情况下扭转圆形双端队列

时间:2010-04-30 20:14:13

标签: c data-structures deque circular-list

嘿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 个答案:

答案 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中,您从节点到节点的移动将在知道队列当前方向的情况下完成。