0

したがって、センチネル ノードを含む一般的な二重リンク キュー構造体があります。

// Queue node:
struct _QNode {
    struct _QNode *prev;     /* Previous list element. */
    struct _QNode *next;     /* Next list element.    */
};
typedef struct _QNode QNode;

// Queue object:
struct _Queue {
    QNode front;    // sentinel node at the front of the queue
    QNode rear;     // sentinel node at the tail of the queue
};

そして、キューノードに整数値をロードする「ダクトテープ」構造体

struct _Tape {
    int32_t payload;    // user data field
    QNode node;       // generic node
};

そして、この 2 つを組み合わせたラッパー クラス IntegerQueue です。

私の質問は、ポップしようとしている特定のノードのペイロード変数にどのようにアクセスしますか?

4

2 に答える 2

1

あなたが持っているものであなたはQNodeの素晴らしいリストを作ることができます。しかし、そのようなQNodeのキューがある場合は、少なくとも受け入れられた方法ではなく、テープではなく、その中のQNodeにのみアクセスできます(各QNodeはTape構造体に含まれているため、一部を差し引くことができます)テープアドレスを取得するためのQNodeのアドレスからの値ですが、他の誰かがそれを見た場合、それはあなたを撃ちます)。
ですから、どういうわけかペイロードをQNodeに入れる必要があると思います。C ++を使用する場合は、テンプレートを使用して一般的な方法でそれを行うことができます。ここではマクロを使用するか、キュー内でvoidポインターをキャストして、ペイロードタイプにキャストします(これにより、再びショットが得られます)。

于 2012-12-08T04:52:13.547 に答える
0

物事を処理するオーソドックスな方法は次のようになります。

typedef struct QNode QNode;
struct QNode
{
    QNode *prev;     /* Previous list element. */
    QNode *next;     /* Next list element.     */
    void  *data;     /* Data for this node     */
};

これは、任意のデータ型 (構造体または単純型) へのポインターを格納するために使用できます。次に、そのようなジェネリック型のキューの周りにタイプ セーフなラッパーを作成できます。これは非侵襲的であることに注意してください。キューに入れられている型は変更されないため、多くの場合有益です。1 つの注意点: を格納するint32_t場合、ポインタは少なくともデータと同じ容量を使用します (64 ビット マシンではポインタに 8 バイト、データには 4 バイト)。特殊な型 ( QNodeInt32) を使用して値を直接格納する方が経済的です。ジェネリシズムはしばしばスペースを消費します。

于 2012-12-08T05:36:16.507 に答える