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
};

以及结合了两者的包装类 IntegerQueue。

我的问题是如何访问要弹出的给定节点的有效负载变量?

4

2 回答 2

1

有了你所拥有的,你可以构建漂亮的 QNode 列表。但是如果你有一个这样的 QNodes 队列,你只能访问其中的 QNodes,而不是你的 Tape,至少不能以公认的方式访问(你可以争辩说,每个 QNode 都包含在 Tape-struct 中,因此减去一些从 QNode 的地址获取磁带地址的值,但如果其他人看到它,你就会被枪杀)。
所以我认为你必须以某种方式将你的有效载荷放入 QNodes。如果您将使用 C++,那么您可以使用模板以通用方式执行此操作,在这里您可以使用宏,或者在 Queue 中使用一个 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     */
};

这可用于存储指向任何数据类型(结构或简单类型)的指针。然后,您可以为此类泛型类型围绕队列创建类型安全的包装器。请注意,这是非侵入性的;它不会改变排队的类型,这通常是有益的。一个警告:如果您打算存储int32_t,那么指针将使用至少与数据一样多的空间(64 位机器上的指针使用 8 个字节,而数据使用 4 个字节)。QNodeInt32使用专门的类型 ( ) 直接存储值会更经济。泛型通常会占用空间。

于 2012-12-08T05:36:16.507 回答