【问题标题】:Stack using linked list. Struct field is of the same type as the struct使用链表堆叠。结构字段与结构的类型相同
【发布时间】:2021-02-24 10:30:04
【问题描述】:
在使用链表练习堆栈时,我遇到了以下代码:
class stack {
private:
struct node {
double value;
node* next;
};
size_t stack_size;
node* head;
...
}
如您所见,结构node 有一个指针字段*node。字段如何与结构具有相同类型?该字段是指向结构的指针,对吗?但它看起来是递归的(?)。我以前没见过这样的风格,这是什么意思?这样写的目的是什么?
【问题讨论】:
标签:
c++
struct
linked-list
stack
【解决方案1】:
字段如何与结构的类型相同?
不能,这不会编译(注意node这个例子中的数据成员不是指针):
struct node {
double value;
node next;
};
但是node *next 是一个指针,它可以工作,因为编译器知道node* 将是你机器上指针的大小。
那个字段是指向结构的指针,对吧?
正确。
但它看起来是递归的(?)
正确。它反映了链表是如何工作的。每个项目都指向下一个,直到下一个是哨兵 (nullptr)。
没见过这样的风格,是什么意思?
不确定您所说的“例如样式”是什么意思。本质是您可以声明一个类型,比如struct MyDataType;,然后拥有指向它的指针或引用,而无需完整的类型定义可用。这是针对多个目标的常用技术。您在这里介绍的那个,还有 PIMPL 成语等等。
这样写的目的是什么?
希望上述问题的答案也回答了这个问题:)
【解决方案2】:
node* 不是node。如果您愿意,可以将其称为“递归”,因为每个node 都可以有一个指向另一个node 的成员。虽然它不是无限递归,因为node* 可以指向node,但不一定如此。当我像这样创建node 时:
node n;
那么node 有一个未初始化的next 成员。没有什么递归的。
这样写的目的是什么?
在链表中,通常每个节点都有指向链表中下一个节点的链接。这可以通过具有node* next 成员的node 来实现。