Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/gwt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 链表问题C++。。。我们可以在一个程序中创建两种不同的节点类型吗?_C++ - Fatal编程技术网

C++ 链表问题C++。。。我们可以在一个程序中创建两种不同的节点类型吗?

C++ 链表问题C++。。。我们可以在一个程序中创建两种不同的节点类型吗?,c++,C++,我还有一个关于链表的项目要完成。 我想知道是否可以编写两个struct节点类型代码来创建两个节点。 如果是这样,我应该如何放置它们? 我的代码将包含一个节点类型,列表中包含“视频”。 和另一个节点类型,列表中有“客户”详细信息 我计划为程序执行的所有其他操作使用函数。我想知道制作两个节点的代码,以及当我专门为它们制作功能时,我应该如何以及在何处指定这些节点?(例如为视频节点插入新视频和为客户节点插入视频(显示他们租用了视频)等等) 有人能解释一下代码的细节,让我明白吗?使用 模板 结构节点{ T

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

我计划为程序执行的所有其他操作使用函数。我想知道制作两个节点的代码,以及当我专门为它们制作功能时,我应该如何以及在何处指定这些节点?(例如为视频节点插入新视频和为客户节点插入视频(显示他们租用了视频)等等)

有人能解释一下代码的细节,让我明白吗?

使用

模板
结构节点{
T*数据;
节点*下一步;
};
然后,您的列表头将如下所示:

Node<Videos> *videos;
Node<Customer> *customers;
Node*视频;
节点*客户;

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

因为类模板的实例化会生成一个新类型,所以可以将列表节点设置为模板:

template<class Tag>
struct ListNode
{
    ListNode *prev, *next;
};
模板
结构列表节点
{
ListNode*prev,*next;
};
然后从同一模板多次派生,并使用不同的标记类型实例化该模板:

struct VideoTag;
struct CustomerTag;

struct Item 
    : ListNode<VideoTag>
    , ListNode<CustomerTag> 
{};
struct-VideoTag;
结构客户标签;
结构项
:ListNode
,ListNode
{};

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

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


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

您是说您已经实现了一个链接列表,现在想使它能够容纳不同的类型吗?我想在我的程序中有两种不同的节点类型。一个列表应该包含视频,另一个列表应该包含客户的详细信息。是的,我读过了……这是否意味着我只需输入一个代码和两个头部就可以创建两个节点?这与创建两个节点不完全一样,是吗?@Oli,@Piotr:我想Yuki需要先体验一下与代码复制相关的痛苦,然后再尝试向他推销模板。@Yuki,Ben说模板是用来防止代码复制的,但在程序员经历了代码复制可能(也将)造成的痛苦之前,模板背后的目的就不那么明显了。@Yuki:想象一下,你不仅有两个这样的列表,还有20个。你发现他们太慢了,所以你决定用一个熟练工。现在你必须做20次,这有点痛苦。然后你发现你在你的skiplist实现中犯了一个错误,所以现在你必须修复它20次,测试20次修复,然后。。。真的很麻烦。我的意思是我想要一个用于生成两种节点类型的代码。这是否意味着我必须为这两种节点类型编写两次节点类型结构代码?@Yuki:可以,也可以使用模板。如果你在这个问题之前从未听说过“模板”这个词,你可能应该只写两次结构。当你变得有经验时,你将开始使用其他人编写的模板,然后自己编写。
struct VideoTag;
struct CustomerTag;

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