LINKED LIST问题C ++ ...我们可以在一个程序中制作两种不同的节点类型吗?

时间:2011-02-27 16:15:55

标签: c++

我还有另一个关于链接列表的项目。 我想知道是否可以用两个struct nodetype代码编写来创建两个节点。 如果是这样我应该如何以及在哪里放置它们? 我的代码将包含一个节点类型,列表中包含“视频”。 另一个节点类型在列表中包含“客户”详细信息。

我计划将函数用于我将为程序启用的每个其他操作。我想知道制作两个节点的代码,以及当我专门为它们制作函数时应该如何以及在哪里指定这些节点?(例如为视频节点插入新视频并为客户节点插入视频(显示它们已租用)视频)等等)...

有人可以解释代码的详细信息,以便我能理解吗?

3 个答案:

答案 0 :(得分:3)

使用templates

template <typename T>
struct Node {
    T *data;
    Node<T> *next;
};

然后,您的列表头部将如下所示:

Node<Videos> *videos;
Node<Customer> *customers;

替代方法是使用不透明指针(void*)作为列表数据(然后转换为正确的类型),但这不是类型安全的,应该避免使用。

答案 1 :(得分:0)

因为类模板的实例化会产生新类型,所以可以使列表节点成为模板:

template<class Tag>
struct ListNode
{
    ListNode *prev, *next;
};

然后从同一模板中多次派生,并使用不同的标签类型对其进行实例化:

struct VideoTag;
struct CustomerTag;

struct Item 
    : ListNode<VideoTag>
    , ListNode<CustomerTag> 
{};

答案 2 :(得分:0)

是的,这是可能的。每个节点类型结构都需要一个不同的名称,每个节点类型结构中的下一个指针都是它自己的类型。名称“node”或“nodetype”没有什么神奇之处,你可以使用“videonode”轻松制作一个链表。

此外,您需要更加谨慎地区分“节点”和“列表”。你说“我想知道制作两个节点的代码”,但这没有任何意义。即使一个列表已经有两个或更多节点,它们也会链接在一起。每个列表都由指向第一个节点的指针表示,但列表在概念上不仅仅是一个节点。

你想要的是两个包含不同类型的列表。所需要的只是为每个列表选择节点类型结构和头指针的唯一名称。