【问题标题】:Declaring structure with itself?自己声明结构?
【发布时间】:2019-12-30 12:10:51
【问题描述】:

我已经开始研究数据结构了,链表就弹出来了。链表背后的想法很简单,但实现(我使用 c++)有点令人困惑,尤其是关于链表中使用的节点。 C++中为单链表定义节点的方式如下

// A linked list node 
struct Node { 
    int data; 
    struct Node* next; 
}; 

或者如果我们使用类,那么它是这样定义的。

class Node { 
public: 
    int data; 
    Node* next; 
}; 

我的困惑出现在这里。如何在 struct Node 中定义另一个具有相同名称的结构?我看到新结构是一个指向节点的指针,但是这个实现实际上是如何工作的?这真的很混乱:(

【问题讨论】:

  • 请注意,struct 和 class 之间没有区别,除了默认访问。 struct Node* next; 是旧 C 的古老遗留物,相当于英语中的动词变位:P

标签: c++11 linked-list nodes


【解决方案1】:

如何在 struct Node 中定义另一个具有相同名称的结构?

这不是正在发生的事情。您可以在数据成员声明 struct Node* next; 中省略 struct 关键字,这样可能更容易理解:

struct Node { 
   int data; 
   Node* next; 
}; 

除了访问说明符(public),现在它与class 版本相同,很明显,您没有在Node 内定义新的struct Node,而是声明一个数据成员next,它是一个指向Node 类型实例的指针。 64 位机器上的指针需要 64 位,这就是编译器可以使用 Node 的定义的原因,因为它必须为 Node 实例保留的大小是已知的。

【讨论】:

    【解决方案2】:

    要声明一个指向你不需要定义类的指针,只需要它的声明。因此这不是递归定义,编译器不会遇到问题。

    你可以这样想:无论指针的类型是什么,指针成员的大小都是相同的,它仍然只需要寻址内存中任何位置的容量。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-06
      • 2018-04-03
      • 2016-10-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多