使用链表堆叠。结构字段与结构类型相同

Stack using linked list. Struct field is of the same type as the struct

在使用链表练习堆栈时,我 运行 跨越了以下代码段:

class stack {
private:
    struct node {
        double value;
        node* next;
    };
    size_t stack_size;
    node* head;
...
}

如您所见,结构 node 有一个指针字段 *node。字段如何与结构具有相同的类型?该字段是指向结构的指针,对吗?但它看起来是递归的(?)。没见过这种风格,什么意思?这样写的目的是什么?

A node* 不是 node。如果你愿意,你可以称它为“递归”,因为每个 node 都可以有一个指向另一个 node 的成员。虽然它 不是 无限递归,因为 node* 可以 指向 node 但不一定如此.当我像这样创建 node 时:

 node n;

那么 node 有一个未初始化的 next 成员。没有什么递归的。

What is the purpose of such writing?

在 linked 列表中,通常每个节点都有一个 link 到列表中的下一个节点。这可以通过 node 拥有 node* next 成员来实现。

How can a field be of the same type as the struct?

不能,编译不通过(注意本例中node数据成员不是指针):

struct node {
    double value;
    node next;
};

但是当 node *next 是一个指针时它可以工作,因为编译器知道 node* 将是您机器上指针的大小。

That field is a pointer to the struct, right?

正确。

But it looks recursive(?)

正确。它反映了链表的工作方式。每个项目都指向下一个,直到下一个是哨兵 (nullptr)。

I haven't seen such a style before, what does that mean?

不确定您所说的“例如风格”是什么意思。本质是你可以声明一个类型,比如 struct MyDataType; 然后有指向它的指针或引用,而不需要完整的类型定义可用。这是实现多个目标的常用技术。你在这里展示的那个,还有 PIMPL 习语等等。

What is the purpose of such writing?

希望以上问题的答案也能回答这个问题:)