是否可以仅使用指向结构的指针(无数据类型)来实现堆栈?

时间:2014-01-16 05:53:19

标签: c pointers stack

假设我有以下结构

typedef struct _Stack {
   struct _Stack *next;
} Stack;

请注意,上面没有用于存储的数据类型,只有*next指向结构的指针。所以,我的问题是以下函数是否有效。

void stackPush(Stack **stackP, void *dataP) {
    Stack *data = (Stack*)dataP;

    data->next = *stackP;
    *stackP = data;
}

我在文件glib的{​​{1}}库中看到了这个函数。但是当我在上面编译时,我收到了警告:gtrashstack.c

我知道,我可以用通用指针重写结构。但我只想知道,为什么以上不起作用?

更新:我的错误,我在这里写In data->next : assignment from incompatible pointer type,但在我的计划中,我错过了typedef struct _Stack

2 个答案:

答案 0 :(得分:2)

此功能有效。可能它用于不同的结构,如:

 typedef struct my_Stack {
   struct my_Stack *next;
   sometype1 somename1;
   ...
   sometypen somenamen;
 } MyStack;

即。对于将指向下一个elem的指针放置为结构的第一个字段的列表。这与通过C ++中的简单继承构建类时的技巧相同。对于这样的结构,您可以致电:

x = malloc(sizeof(struct my_Stack));
x->somename1 = aaa; ...
stackPush(&mylist, x);

我不确定C标准是否支持这种编程风格。这对初学者来说不是一个好习惯。它适用于那些知道他们在C中做什么的开发人员。

答案 1 :(得分:1)

答案是肯定的,有可能只用指向结构的指针(没有数据类型)来实现堆栈。请参阅Linux中c中通用列表或队列的实现(不知道它是否也在windows中实现)。了解它的实施方式Linux Kernel Linked List Explained