C++ 代码解释:指针如何在链表结构上工作

问题描述 投票:0回答:1

我无法理解这段 C++ 代码的开头发生了什么,它向我解释了如何使用动态数组实现堆栈。我确信代码是正确的,因为程序运行正确(正确的结果),但我不明白!

struct Node {
    char Info;
    Node *Link;
};

typedef Node *Stack;

让我们看看:

  1. 有一个
    struct
    称为
    Node
    ,它有
    Info
    *Link
    作为“字段”,就像表格纸上的字段一样。所以
    Node
    是带有空“字段”的 “模板” (
    struct
    ) 的名称。每次我们在这个程序上使用
    Node
    ,就像,
    Node StackOverflow
    ,就像复印这张表格并填写它的字段;
  2. *Link
    本身就是另一个
    Node
    !但是
    struct
    的指针(“*”)部分怎么可能是同一个
    struct
    的另一个实例呢?指针不像表格纸那样有“字段”!它们只能有一个地址作为值,因此只有一个字段,就像任何其他变量一样。这段代码没有意义;
  3. 然后
    *Stack
    typedef
    作为一个指针(“*”),它是一个
    struct
    (“Node”),里面有一个指针(“*Link”),实际上是另一个结构体(“Node *Link”) ”)。我什么都看不懂了!!!帮助!
c++ pointers struct typedef
1个回答
2
投票

让我们从代码开始。

struct Node {
    char Info;
    Node *Link;
};

typedef Node * Stack;

你写了这个:

有一个名为 Node 的结构,它有 Info 和 *Link 作为“字段”, 就像表格纸上的字段一样。所以 Node 是一个“模板”的名称 (结构)带有空“字段”。每次我们在这个程序上使用 Node 时, 就像 Node StackOverflow 一样,就像复印此表单 纸并填充它的字段;

很接近了。你没有

* Link
,你有一个
Link
字段,它是指向另一个节点的指针。这是一个重要的概念,称为链表。第一项指向第二项,该项指向第三项,依此类推。 (它还可以用于更多事情)。

所以你可以这样做:

 Node myNode;
 myNode.Info = 'A';
 myNode.Link = nullptr;

您现在有一个只有一个项目的链表,它的信息是“A”。

然后你可以这样做:

 Node * anotherNode = new Node();
 myNode.Link = anotherNode;
 anotherNode->Info = 'B';
 anotherNode->Link = nullptr;

现在您有一个包含两个项目的链表,其值为“A”和“B”。

链接本身就是另一个节点!但是结构体的指针(“”)部分怎么可能是同一结构体的另一个实例呢?指针没有 “字段”就像表格一样!他们只能有一个地址作为值,所以 与任何其他变量一样,只有一个字段。这段代码不会使 感觉;

不。该字段称为

Link
,类型为
Node *
。也就是说,它是指向另一个节点的指针。

然后 Stack 被类型定义为一个指针(“”),它是一个结构体 (“Node”)内部有一个指针(“*Link”),这实际上是另一个 struct(“节点*链接”)。我什么都看不懂了!!!帮助!

这也是同样的困惑。类型是

Stack
,它是
Node *
的别名。也就是说,Stack 是指向 Node 对象的指针。

所以这两行代码是完全一样的:

 Node * nodePtr1 = nullptr;
 Stack  nodePtr2 = nullptr;

它们都定义了一个初始化为 nullptr 的

Node *

© www.soinside.com 2019 - 2024. All rights reserved.