所以我有一个带有sentinel节点的通用双链接队列结构:
// 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
};
一个“duct-tape”结构,用于将整数值加载到队列节点
struct _Tape {
int32_t payload; // user data field
QNode node; // generic node
};
一个结合了两者的包装类IntegerQueue。
我的问题是如何访问您尝试弹出的给定节点的有效负载变量?
答案 0 :(得分:1)
有了你所拥有的,你可以建立很好的QNode列表。但是如果你有这样的QNode队列,你只能访问其中的QNode,而不是你的磁带,至少不能以一种可接受的方式访问(你可以说,每个QNode都包含在一个Tape-struct中,因此减去一些从QNode的地址获取磁带地址的值,但是如果有人看到它,那就会让你开枪。)
所以我认为你有办法将你的有效负载放入QNode。如果您使用C ++,那么您可以使用模板以通用方式执行此操作,在这里您可以使用宏,或者在Queue内部使用void-pointer然后将其强制转换为您的有效负载类型(这会再次让您拍摄)。 / p>
答案 1 :(得分: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
)直接存储值会更经济。通用主义往往需要空间。