表达式必须具有struct或union类型

时间:2018-03-27 18:47:25

标签: c pointers struct

我试图在C中创建堆栈/链接列表实现。我在堆栈的pop功能上挣扎。

这是我的堆栈/链接列表实现的样子:

// a cell
struct cell_s
{
  void *elem;
  struct cell_s *next;
};
typedef struct cell_s cell_t;

// the list is a pointer to the first cell
struct linkedlist_s
{
  struct cell_s *head;
  int len;
};
typedef struct linkedlist_s linkedlist_t;

这是pop功能:

/**
 * Pop remove and return the head
 */
cell_t *pop(linkedlist_t *list)
{
    if ((*list).len == 0) {
        // we cannot pop an empty list
        return NULL;
    }
    else 
    {
        cell_t* tmp = (*list).head;
        (*list).head = (*list).head.next; // <-- error occurs here
        (*tmp).next = NULL;
        return tmp;
    }
}

我不明白我做错了什么。 (*list).headstruct cell_s,因此我应该能够访问属性next?但编译器不允许我这样做。

感谢。

1 个答案:

答案 0 :(得分:3)

head字段不是struct cell_s。它是struct cell_s *,即指向struct cell_s的指针。因此,您需要使用->运算符取消引用并访问该成员。

list->head = list->head->next;

另请注意,ptr->field(*ptr).field更容易阅读。