C++ 制作通用链表在结构开头放置下一个指针

C++ 制作通用链表在结构开头放置下一个指针,c++,generics,linked-list,C++,Generics,Linked List,我正在读其中一本书,只想问一个问题 链表结构的定义:: typedef struct LinkedList{ LinkedList* next; int data; } 书中说,“将下一个指针放在结构或类的开头,可以轻松编写通用的列表处理例程,而不管数据是什么。” 我不明白把下一个指针放在上面会有什么帮助 另外,要创建一个泛型列表,我们不需要将数据类型设置为泛型还是说为void*?如果将下一个指针放在开始处,您所拥有的只是一个void*,但您知道它是一个链表节点,那么您总是可以找到下一

我正在读其中一本书,只想问一个问题

链表结构的定义::

typedef struct LinkedList{
  LinkedList* next;
  int data;
}
书中说,“将下一个指针放在结构或类的开头,可以轻松编写通用的列表处理例程,而不管数据是什么。”

我不明白把下一个指针放在上面会有什么帮助


另外,要创建一个泛型列表,我们不需要将数据类型设置为泛型还是说为void*?

如果将下一个指针放在开始处,您所拥有的只是一个void*,但您知道它是一个链表节点,那么您总是可以找到下一个指针。这与放置在“数据”后面的下一个指针形成对比,假设“数据”可以有不同的大小,您需要了解更多关于对象的信息,以便找到下一个指针

我个人不认为有任何原因,我同意,参数应该模板化:

template <class T> class ListElement
{
   T data;
   ListElement* next;
   ...
}
模板类ListElement
{
T数据;
ListElement*下一步;
...
}
可能会有一些关于内存对齐速度的问题,但我对此表示怀疑


<>马里奥>

你所看到的书,编程面试被揭露,(据我所知)不是一本关于C++的书,而是一本书,它的目的是为你准备回答在一个典型的技术面试中可能会问到的问题。我不会把书中的任何东西当作最好的C++实践,除非它被标记为这样(也许甚至不是)。 在链表节点结构中首先放置下一个指针的建议来自像C这样的语言,在C语言中,您不能依赖真正的、编译器支持的继承。实际上,其思想是通过将数据装载到链表节点结构上,自己实现类似于继承的功能。考虑:

typedef struct LinkedList {
  LinkedListNode* next;
  int type;
}

typedef struct Person {
  LinkedList listNode;
  char name[64];
  int age;
}

typedef struct Address {
  LinkedList listNode;
  char streetAddress[128];
  char city[32];
  char state[2];
  char zip[10];
}

typedef struct Employee {
  Person person;
  int department;
  int salary;
}
这里的LinkedList是一种基本类型——它本身并没有多大用处,但可以作为具有更多数据的节点的起点。要在节点上执行链表操作,您不必了解任何其他类型的信息。。。您可以将任何节点指针强制转换为LinkedList*并访问所需的信息。因此,您可以有一个人员列表和地址列表,这两个列表都可以通过相同的例程进行操作。同样,您可以将雇员*强制转换为个人*并使用您为Person on Employee编写的任何操作。如果为LinkedList的
类型
字段指定适当的常量,您甚至可以混合PersonNode并在以后使用
类型
字段来确定每个节点的类型

20多年前,这是一种有用的编程方式。当然,它仍然有效,但是如果有选择的话,大多数人会选择让编译器为他们管理继承,而所有现代面向对象语言都提供了这个选择


<强>教训:在旧代码中遇到的情况下,理解该技术,但如果可以,则为新代码选择一个不同的实现。

如果这个定义从C++书中取1:1,那么这本书就糟透了。这可能是对你所质疑的断言的一种可能的解释。你在哪里看到这一点?您在这里打印的语句只有在作者正在做一些更容易使用继承或模板的事情时才有意义。从表面上看,这条线没有什么意义。你确定这是一本C++书吗?这看起来很像C代码……这太极端了,不能说鲁道夫爵士。我不知道作者对自己的观点有多好,但肯定这是为采访做准备的最好的开始。书名是采访。Cody,这是一本采访书。你的代码片段看起来更像C,而不是C++,所以我假设你正在使用。如果是C++,我建议抛出这本书,我得到了你的观点,这是有意义的,但是书中说数据类型是int,这增加了你的引用所说的混淆:“不管数据保存什么,都很容易编写通用的列表处理例程”。--听起来他们的目的是要认识到,这种技术足够灵活,可以处理任何类型的包含数据。你的代码片段对我来说是有意义的,但它仍然没有回答这个问题?我的回答是,这本书没有意义。正如其他人指出的,代码大部分是C++,特别是如果模板在同一段中使用的话,谢谢Caleb。理解解释清楚的答案和问题。