【问题标题】:Creating a stack in C, structure for nodes在 C 中创建堆栈,节点结构
【发布时间】:2013-05-03 09:32:15
【问题描述】:

我已经获得了构成我的堆栈的节点的结构,但我无法理解它。

    struct stackNode 
{
  char data;
  struct stackNode *nextPtr;
};

typedef struct stackNode StackNode; 
typedef StackNode *StackNodePtr;

我知道我有一个名为 stackNode 的结构,重命名为 StackNode(或第二种类型,除了名称之外的所有内容都相同?),它有两种类型,一个字符和一个指向 stackNode 的指针。

我不知道最后一行是什么意思,谁能一步步解释给我看?我认为这意味着有一个新类型,它是一个指向 StackNode 的指针,称为 StackNodePtr。是这样吗?

【问题讨论】:

    标签: c struct stack typedef nodes


    【解决方案1】:

    是的,每当您使用StackNodePtr 时,您实际上是在使用StackNode*,而struct stackNode* 又等于struct stackNode*。间距和星号位置显然会导致一些混乱。我会个人将它写成typedef StackNode* StackNodePtr;,以便更清楚地了解什么是typedef-ed。

    这三行是​​相等的:

    StackNodePtr myPointer;
    StackNode *myPointer; 
    struct stackNode *myPointer;
    

    typedef struct stackNode StackNode 的原因通常是为了避免在使用时必须写struct

    【讨论】:

    • 好的。我编写的用于此堆栈的 pop 方法存在一些问题。我认为我有很大的错误或其他什么,因为我遇到了一些错误。我尝试将链表的标头分配给临时 stackNode,并使用此 temp.nextPtr = *topPtr->nextPtr; 和 *topPtr 作为标头的 StackNodePtr。我收到错误“在非结构或联合的情况下请求成员‘nextPtr’”,你知道为什么吗? (抱歉格式化...我是新人)
    • 如果您有 StackNodePtr,则不需要 asterix。请参阅答案以获得解释(它“包含”在 StackNodePtr typedef 中)!
    • 哦,是的,我在没有 asterix 的情况下尝试过,但收到了不同的错误消息。使用temp.nextPtr = topPtr->nextPtr; 这一次我收到“请求成员‘nextPtr’,而不是结构或联合。”
    • temp 是 StackNode,topPtr 是 StackNodePtr 吗?
    • 如果我将它们都设为 StackNodePtr(并相应地将 . 调整为 ->),我会收到错误消息“请求成员‘数据’,而不是结构或联合”。在我正在解决的问题中,topPtr 必须是 StackNodePtr。
    【解决方案2】:

    你有三样东西。

    1. 您正在声明一个名为 struct stackNode 的类型,并提供结构定义。
    2. 您正在定义一个新类型StackNode,它是struct stackNode 的别名(并且类型兼容)。
    3. 您正在定义一个新类型StackNodePtr,它是StackNode *(和struct stackNode *)的别名(同样,类型兼容)。

    问题在于,不是将节点变量声明为struct stackNode newNode,将列表头声明为struct stackNode *head,而是将节点变量声明为StackNode newNode,将列表头声明为StackNodePtr head

    这是一个相当普遍的习语,尽管有些人建议不要这样做。 (当然,其他人也坚持认为这是正确的方法。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-10-11
      • 2012-06-10
      • 2017-01-06
      • 2011-01-03
      • 2011-12-28
      • 2017-04-18
      • 1970-01-01
      相关资源
      最近更新 更多