2

Hey Stackoverflow 私は宿題に取り組んでおり、センチネルなしで循環リンクされた deque を元に戻そうとしています。ここに私のデータ構造があります:

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

4 に答える 4

2

抽象的なデータ型 (リスト、キュー、deques など) を扱うときはいつでも、ポインターが関係するときはいつでも、データ構造とそのポインターを紙の図に描くことが本当に役に立ちます。すべてにラベルを付けます。次に、表示されたものをコーディングします。それは本当にそれをずっと簡単にします。私は大学以来、deques を使用していませんが、問題になる可能性があるため、前、次、および前を混同しないようにしてください。また、ヌル ポインターを逆参照する前に必ず確認してください。

うまくいけば、これは答えを直接与えることなく役立ちます。あなたの教授はそれを高く評価するかもしれません。;-)

于 2010-04-30T20:53:14.420 に答える
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 .
     */
}

更新:すべてのポインターを逆にすると(結果から判断すると、今は機能しているように見えます)、今必要なことは、「戻る」ポインターを「戻る」->「前」に設定することです。

于 2010-04-30T20:27:05.673 に答える
1

あなたの問題に対する直接的な答えではありませんが、学校に戻って、Data Display Debuggerがこのような問題のデバッグに非常に貴重であることがわかりました。

于 2010-04-30T20:58:14.727 に答える
0

これを行う最も簡単で最速の方法は、キューの方向の解釈のみを変更することです。

方向は cirListDeque に格納され、ノードからノードへの移動は、キューの現在の方向を認識して行われます。

于 2010-04-30T20:56:28.347 に答える