我有一个包含两种类型结构的堆叠。 结构梭哈和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;
}
你必须编码类型的信息,当你推,简单的可能输入标签:
#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的阵列,而不是无效*的。