我已经开始研究数据结构,链表弹出来了。链表背后的想法很简单,但实现(我使用 c++)有点令人困惑,尤其是关于链表中使用的节点。在C++中为单向链表定义节点的方式如下
// A linked list node
struct Node {
int data;
struct Node* next;
};
或者如果我们使用类,那么它是这样定义的。
class Node {
public:
int data;
Node* next;
};
我的困惑在这里出现。如何在结构节点中定义另一个具有相同名称的结构?我看到新结构是指向节点的指针,但是此实现实际上如何工作?这真的很令人困惑:(
如何在结构节点中定义另一个同名的结构?
这不是正在发生的事情。可以在数据成员声明中省略struct
关键字struct Node* next;
以便更容易理解:
struct Node {
int data;
Node* next;
};
除了访问说明符(public
),这现在与class
版本相同,并且很明显,您没有在Node
内部定义新的struct Node
,而是声明一个数据成员next
,它是指向类型Node
实例的指针。64位机器上的指针需要64位,这就是为什么编译器可以使用Node
的这个定义,因为它必须为Node
实例保留的大小是已知的。
要声明指向某物的指针,您不需要定义类,只需要它的声明。因此,这不是递归定义,编译器不会遇到问题。
你可以这样想:无论指针的类型如何,指针成员的大小都相同,它仍然只需要寻址内存中任何位置的容量。