在C语言中创建栈,节点结构

3

我已经得到了一个节点结构来构建我的栈,但是我对此还有些困惑。

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

typedef struct stackNode StackNode; 
typedef StackNode *StackNodePtr;

我理解我有一个名为stackNode的结构体,已更名为StackNode (或者是另一种类型,除了名称外一切相同?)。它有两种类型:char和指向stackNode的指针。
我不确定最后一行的意思,能否有人解释一下?我的想法是这表示有一个新类型,它是指向StackNode的指针,称为StackNodePtr。这正确吗?
2个回答

4

是的,每当您使用StackNodePtr时,实际上您使用的是StackNode*,而后者又等同于struct stackNode*。空格和星号的放置显然会导致一些混淆。我个人会将其写成typedef StackNode* StackNodePtr;,以更清晰地说明什么被typedef为什么。

这三行代码是相等的:

StackNodePtr myPointer;
StackNode *myPointer; 
struct stackNode *myPointer;
< p > typedef struct stackNode StackNode 的原因通常是避免每次使用时都写 struct


好的。我在编写与此堆栈配合使用的pop方法时遇到了一些问题。我认为我可能做错了什么,因为我收到了很多错误报告。我试图将链表的头分配给一个临时的stackNode,并使用temp.nextPtr = *topPtr->nextPtr;,其中*topPtr是指向头部的StackNodePtr。我收到了错误消息“request for member ‘nextPtr’ in something not a structure or union”,你知道为什么吗?(抱歉格式不太好,我是新手) - Duck
如果您有一个StackNodePtr,您就不需要星号。请参见答案以获取解释(它已包含在StackNodePtr typedef中)! - Victor Sand
哦,是的,我已经尝试过没有星号,但是我得到了不同的错误消息。使用 temp.nextPtr = topPtr->nextPtr; 这次我得到了“请求访问非结构体或联合体中的成员'nextPtr'” 的错误消息。 - Duck
temp是一个StackNode,topPtr是一个StackNodePtr吗? - Victor Sand
如果这个问题得到了解答,请考虑接受答案以供将来参考。http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work - Victor Sand
显示剩余2条评论

2
你有三件事情:
  1. 你正在声明一个名为struct stackNode的类型,并提供结构定义。
  2. 你正在定义一个新类型StackNode,它是struct stackNode的别名(并且与之兼容)。
  3. 你正在定义一个新类型StackNodePtr,它是StackNode *(和struct stackNode *)的别名(同样与之兼容)。
重点是,你可以将节点变量声明为StackNode newNode,而不是struct stackNode newNode,将列表头声明为StackNodePtr head,而不是struct stackNode *head
这是一种相当常见的习惯用法,尽管有些人建议不要这样做。(当然,也有其他人坚持认为这是正确的方法。)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接