链接列表:结构中的结构?

Linked Lists: structure inside a structure?

在使用 C++ 中的链接列表方面,我仍然有点陌生。我正在翻阅我的教科书,在链接列表部分找到了这个头文件。

//Specifcation file for the NumberList class
#ifndef NUMBERLIST_H
#define NUMBERLIST_H

class NumberList
{
private:
  //Declare a structure for the list
  struct ListNode
  {
     double value;         //The value in this node 
     struct ListNode *next;  //To point to the next node 
  };

  ListNode *head;      //List head pointer
public:
  //Constructor 
  NumberList();
   { head = nullptr; }

  //Destructor 
  ~NumberList();

  //Linked list operations
  void appendNode(double);
  void insertNode(double);
  void deleteNode(double);
  void displayList() const;
};
#endif

所以我想知道struct ListNode *next;那一行到底发生了什么 好像是一个指针,那为什么非要在这个指针上加上“struct”部分呢?起初我很困惑,因为我认为它是另一个结构内部的结构。

有人可以给我解释一下吗?

So I am wondering what exactly is happening on the line where it says struct ListNode *next;

正如你后面提到的,它是一个指针,指向struct ListNode的下一个块。检查下图。这里的ListNodeDataNext组成。 Next 是指向下一个 ListNode 单元格的指针。

It seems to be a pointer, so why do we have to include the "struct" part on this pointer?

C-style声明。在 C 中,struct 名称在它们自己的命名空间中。在 C++ 中你不需要这个。你在这里看到它是因为 C++ 在这种情况下也支持 C-style 声明。您可以在此处查看我编辑的代码。我从 ListNode 结构内的 next 指针声明中删除了 struct 部分,它工作正常。

#include <iostream>

using namespace std;

class NumberList
{
private:
  //Declare a structure for the list
  struct ListNode
  {
     double value;         //The value in this node 
     ListNode *next;  //To point to the next node 
  };

  ListNode *head;      //List head pointer
public:
  //Constructor 
  NumberList() { head = nullptr; }
  
  NumberList(double val) {
      head = new ListNode();
      head->value = val;
  }

  //Destructor 
  ~NumberList();

  //Linked list operations
  void appendNode(double);
  void insertNode(double);
  void deleteNode(double);
  void displayList() {
      ListNode *curr = head;
      while(curr != nullptr) {
          cout << curr->value << " ";
          curr = curr->next;
      }
      cout << endl;
  }
};

int main()
{
    NumberList *nl = new NumberList(5.0);
    nl->displayList();
    return 0;
}