如何从栈中弹出不同类型的结构体(How to Pop different types of Stru

2019-10-19 17:41发布

我有一个包含两种类型结构的堆叠。 结构梭哈和struct教授当我想要把我创建了两个推送功能,两个结构的东西。 虽然我想这是一个功能,但它的好,我可以用它承受。

现在流行。 如果我想从栈中弹出一个学生,我必须做一个流行的功能专门针对学生只? 与教授一样吗?

我怎么能存储该项目,如果我不知道是什么类型呢? 什么类型的必须元素,存储的项目呢?

这里有结构:

struct MyStack
{
    int head;
    void **stack;
    int size;
};
typedef struct MyStack STACK;

struct stud
{
    char flag;
    char fname[50];
    int semester;
};
struct prof
{
    char flag;
    char fname[50];
    char course[30];
};

现在创建流行的功能。 什么项目的类型我传递的功能?

int Pop(STACK *stack,int *head,??? *elem)
{
if(stack->head<=-1)
    return 0;

*elem=stack->stack[*head];
*head--;
return 1;
}

Answer 1:

你必须编码类型的信息,当你推,简单的可能输入标签:

#define STUD 0
#define PROF 1

struct stack_entry {
    int type;
    void *item;
};

struct MyStack
{
    int head;
    struct stack_entry *stack;
    int size;
};

然后改变你的推送功能,当你推附加正确的标签。 然后,在弹出的,简单又可能是只返回一个stack_entry结构,并让调用函数看着办吧。 在这一点上,你可能需要比“stack_entry”虽然snazzier名。 此外,这将是轻微最好使用一个联盟:

struct stack_entry {
    int type;
    union {
        struct stud *stud;
        struct prof *prof;
    } item;
}

因为那么编译器可以帮你了一下,当然你还是要或多或少尽可能小心将与一个void *。

编辑:初始化...

您没有标记,然后用任何缓冲的结束,因为你必须在结构尺寸可变的。 但是,如果你想做的事,我将有一个是它自己的类型

#define END_OF_BUFFER 1
#define STUD 2
#define PROF 3

然后init的你可以这样做:

stack->size = size; 
stack->stack = calloc(sizeof(*stack->stack), size + 1); 
stack->stack[size].type = END_OF_BUFFER; 
stack->head=-1; 

虽然我倾向于用“头”来指代指向写入下一个地方的指针,但我不知道那是多么的标准。 但缓冲是strack_entries的阵列,而不是无效*的。



文章来源: How to Pop different types of Structs from a Stack
标签: c struct stack