结构体标签和结构体名(链表为例)

在C语言中,结构体标签(tag)和结构体名字(name)通常是用来引用结构体类型的两个不同的概念。

  1. 结构体标签(tag): 结构体标签是在结构体定义时给结构体起的一个标识符,用于标记这个结构体的类型。例如,在以下的结构体定义中,struct tag 就是结构体标签。

    struct tag {
        int x;
        int y;
    };
    

    这里的 tag 是结构体的标签,用于标识这个结构体的类型。

  2. 结构体名字(name): 结构体名字是通过 typedef 关键字为结构体定义的一个别名。通过 typedef struct tag 创建了结构体的别名 tag_t,这个别名可以用来声明结构体变量,就像使用原始的结构体名一样。

    typedef struct tag {
        int x;
        int y;
    } tag_t;
    

    在这里,tag_t 是结构体的别名,可以用来声明变量,例如 tag_t myStruct;

总的来说,结构体标签是在结构体定义时起的一个标识符,而结构体名字是通过 typedef 别名机制为结构体定义的一个简化名称。结构体标签和结构体名字可以相同,也可以不同,具体的选择取决于程序员的风格和约定。


typedef struct tag {
    BiTree p;            // 数的某一个结点的地址值
    struct tag *pnext;    // 指向链表中下一个结点的指针
} tag_t, *ptag_t;

这个typedef为结构体定义了两个名字:

  1. tag_t:这是结构体本身的名字。
  2. ptag_t:这是指向该结构体的指针的名字。

在这个上下文中, "tag_t" 用于表示结构体本身,而 "ptag_t" 用于表示指向该结构体的指针。在 C 编程中,通常使用前缀 "p" 来表示指针,这是一种常见的命名约定。

为结构体选择名字的原因可能是任意的,也可能基于代码中使用该结构体的具体上下文。需要注意的是,C 中的命名约定并不是强制性的,开发者在选择类型和变量名字时通常有一定的灵活性。

tag 是一个结构体的名字。具体来说,typedef struct tag { /* 结构体成员 */ } tag_t, *ptag_t; 这段代码定义了一个结构体,其中 tag结构体的标签(tag)。这个结构体被命名为 tag_t,而 ptag_t 是指向这个结构体的指针类型。

"tag" 在这里不是特指某个概念,而更像是一个标识符或者名称。这种选择通常是由程序员根据代码的语境和用途来决定的。可能在实际的代码中,tag 结构体用于表示树节点或链表节点等数据结构中的某个元素。


关于当树非空时pcur->p的具体含义:

在代码的一开始,确实没有明确将 pcur 初始化为 phead。在这种情况下,pcur 会一直指向 phead,因为在第一次插入新结点时,pcur 就被设置为 phead,之后它会在条件满足时移动到下一个队列结点。

现在来看 NULL == pcur->p->lchild 的条件。这个条件判断是在当前要插入新结点位置的队列结点的 p 指向的树结点的左子树是否为空 pcur->p 是队列结点中存储的指向新申请的树结点的指针lchild 表示树结点的左子树。

所以,NULL == pcur->p->lchild 成立时,表示当前 pcur->p 所指向的树结点的左子树为空,即当前要插入新结点的位置是该树结点的左子树。


pcur->ppcur->next 不是等价的,因为它们分别指向不同的结构体成员。

  1. pcur->p:表示指向当前队列结点中存储的树结点的指针。
  2. pcur->next:表示指向下一个队列结点的指针。

代码片段中,pcur 是用来表示队列中当前要插入新结点位置的队列结点,而 pcur->p 则指向该队列结点中存储的树结点。因此,pcur->ppcur->next 不是等价的。

关于 ptail->pnext=listpnew; 的含义:

  • ptail 是队列的尾部结点,它用来维护队列的末尾。
  • ptail->pnext 表示尾部结点的下一个结点,即新创建的结点 listpnew
  • 所以ptail->pnext = listpnew; 表示将新的结点 listpnew 插入到队列的末尾,即将 listpnew 设为队列的新尾部。

这样,队列就可以保持按顺序插入结点的顺序,而 ptail 现在指向新插入结点 listpnew,以便下一次插入新结点时,将其放在队列的尾部。


listpnew->p=pnew;

这个代码片段中,listpnew->p = pnew; 的含义是将指向新申请的树结点 pnew 的指针存储在辅助队列结点 listpnew 中。这个操作将队列结点 listpnew 中的指针 p 指向了新创建的树结点 pnew,以便在后续操作中可以方便地访问到这个新的树结点。

实际上,listpnew 是一个辅助队列结点,它的目的是用来构建一个队列,按照输入顺序维护新创建的树结点。通过 listpnew->p 存储了新创建的树结点 pnew 的指针,可以在需要的时候方便地访问到这个树结点。

指针 p 属于队列结点 listpnew 中。在这段代码中,listpnew 是辅助队列的结点类型,它用于维护一个队列,存储了树结点的指针。结构体 tag_t 中的成员 p 就是用来存储指向新创建的树结点的指针。

具体来说,listpnew->p 就是 listpnew 结点中存储的指向新创建的树结点的指针。这种设计使得队列能够按照输入的顺序维护新创建的树结点。

所以,当执行 listpnew->p = pnew; 时,实际上是将 listpnew 结点中的指针 p 指向了新创建的树结点 pnew


p的作用就是相当于辅助队列中的用来指向树的指针

代码中,p 是辅助队列结点中的指针,用来指向新创建的树结点。

具体而言,每当读取一个字符并创建一个新的树结点 pnew 时,都会创建一个辅助队列结点 listpnew,并将 pnew 的指针赋值给 listpnew 中的 p。这样就建立了一个关联,使得辅助队列中的每个结点都能指向一个新创建的树结点。

这种设计有助于在队列中维护树结点的顺序,以便按照输入的顺序构建树结构。当需要引用新创建的树结点时,通过访问 listpnew->p 就能获取到相应的指针。


  • pcur: 是一个指向队列结点的指针,用于表示当前要插入新结点的位置的队列结点。
  • pcur->p: 是 pcur 所指向的队列结点中的指针,它指向一个新创建的树结点。
  • pcur->p->lchild: 是 pcur->p 所指向的树结点的左子树指针。

所以,pcur->p->lchild 表示当前 pcur 指向的队列结点所对应的树结点的左子树指针。通过检查这个左子树指针是否为 NULL,可以判断当前位置是否可以插入新结点的左子树。

如果 pcur->p->lchildNULL,则表示当前位置可以插入新结点的左子树;反之,如果 pcur->p->lchild 不为 NULL,则说明左子树已经被占用,需要考虑插入新结点的右子树。

  • 30
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

陆小果不会写代码

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值