我想创建一个通用堆栈。我想用链表实现它。
我创建了这个结构 stack_l :
typedef struct stack
{
void * data;
void (*copy)(void *o);
struct stack *next;
} stack_l;
我有一些问题:
stack_l * Push(stack_l * head,void * d);
答案 0 :(得分:1)
首先,stack
和stack_l
不需要不同的标识符。现在,问你的问题:
您的Push
功能与copy
中stack_l
字段的类型不兼容。如果要在struct
中包含指向(成员)函数的指针,使其看起来像C ++,则仍然必须将对象传递给这些函数。
是的,你必须在某个地方实现你的功能,而这不能在struct stack
的定义范围内。这意味着您确实需要某种构造函数(如果愿意,可以将其称为newStack
)。你的构造函数必须至少初始化你的函数指针(如果你想保留它们)。如果您选择不保留这些函数指针,可以按照建议将初始化代码放在push
例程中:
stack_l* stackPush(stack_l* head, void* content) {
// head might be NULL, meaning the stack is "empty" or it might be an actual pointer
// we don't care
stack_l* const front = malloc(sizeof(stack_l));
*front = (stack_l){.data = content, .next = head};
return front;
}
请注意,您必须明确说明空堆栈是什么。因此,为了清晰起见,您可能希望实现构造函数:
stack_l* stackCreateEmpty() {
retun NULL;
}
甚至可能是一个析构函数:
void stackDestroyEmpty(stack_l* s) {
assert(s == NULL && "Tried to destroy non-empty stack.");
}
关于你的上一个问题:如上所述,你必须使用malloc
来获取容纳stack_l
对象的空间,除此之外,你不需要为你的{分配额外空间{1}}成员,因为它是void*
的一部分。