【问题标题】:How do I use a self referential struct definition (in C)?如何使用自引用结构定义(在 C 中)?
【发布时间】:2018-10-26 15:09:23
【问题描述】:

这是我的情况。我有一个哈希表和一个节点作为我的结构。节点具有指向其他节点的指针(链表),哈希表是节点数组。我将这两种结构定义为:

typedef struct node{
    char* hashStr;
    struct node* nextNode;
}node;

typedef struct hashTable{
   int emptyNodes[16];
   node* pods[16];
}hashTable;

我已将链表中的最大节点数定义为 32。每当我将节点添加到链表时,我都会检查链表的长度是否为 32。如果长度为 32,我想添加另一个节点,我想删除链表中的第一个节点,并将新节点添加到后面,就像一个先进先出队列。

我的问题是删除第一个节点。与其删除第一个节点,我认为最合理的做法是将节点指针放在 hashTable 中(即在某个键处(因为它是节点指针的数组)),只需指向下一个被引用的节点作为node struct 中的nextNode。我不能这样做,因为nextNode 不是struct

我试过了:

(*addr).pods[key] = (*addr).pods[key].nextNode;

我得到错误:

error: request for member 'nextNode' in something not a structure or union

我了解该错误,但我不确定如何修复它。我在 stackoverflow 上找到了这个,但我不确定如何将它应用到我的工作中(如果可以的话):

Why do I get "request for member in something not a struct or union" from this code?

【问题讨论】:

  • pods[key] 是一个指针。您需要使用pods[key]->nextNode
  • 您宁愿得到错误,因为您使用的项目是 not 结构。仔细阅读编译器错误。正确的代码应该是addr->pods[key] = addr->pods[key]->nextNode;

标签: c


【解决方案1】:
(*addr).pods[key] = (*addr).pods[key]->nextNode;

pods 是一个指针数组。获得指针后,您需要取消引用它以访问底层对象。

【讨论】:

    【解决方案2】:

    改变这个:

    (*addr).pods[key].nextNode;
    

    到这里:

    (*addr).pods[key]->nextNode;
    

    因为pods[key]node* 类型,即一个指向node指针

    【讨论】:

      【解决方案3】:

      这里

      node* pods[16];
      

      pods[key] 属于 node* 类型。使用 pods[key] 访问 nextNode 时,使用箭头 -> 运算符。例如

      (*addr).pods[key]->nextNode
      

      【讨论】:

      • True @alk 今天发生了很多错误。谢谢指正。
      猜你喜欢
      • 2012-04-09
      • 2010-10-09
      • 2021-05-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多