我已经获得了构成我的堆栈的节点的结构,但我无法理解它。
struct stackNode
{
char data;
struct stackNode *nextPtr;
};
typedef struct stackNode StackNode;
typedef StackNode *StackNodePtr;
据我所知,我有一个名为stackNode的结构,重命名为StackNode(或第二种类型除了名字之外的所有内容?),它有两种类型,一个char和一个指向stackNode的指针。
我不确定最后一行是什么意思,任何人都可以介入并向我解释一下吗?我认为这意味着有一个新类型,它是一个指向StackNode的指针,称为StackNodePtr。这是对的吗?
答案 0 :(得分:4)
是的,每当您使用StackNodePtr
时,您实际上使用的StackNode*
又等于struct stackNode*
。间距和星号放置显然会导致一些混乱。我会亲自将其写为typedef StackNode* StackNodePtr;
,以便更清楚地知道什么是typedef ed。
这三行是平等的:
StackNodePtr myPointer;
StackNode *myPointer;
struct stackNode *myPointer;
typedef struct stackNode StackNode
的原因通常是避免在使用时编写struct
。
答案 1 :(得分:2)
你有三件事。
struct stackNode
的类型,并提供了结构定义。StackNode
,它是struct stackNode
的别名(并且与其类型兼容)。StackNodePtr
,它是StackNode *
(和struct stackNode *
)的别名(并且,再次与其类型兼容)。这样做,而不是将您的节点变量声明为struct stackNode newNode
,而您的列表标题为struct stackNode *head
,您将节点变量声明为StackNode newNode
,列表标题为{{{ 1}}。
这是一个相当普遍的习惯用语,尽管有些人建议不要这样做。 (当然,其他人也坚持认为这也是正确的方法。)