使用C中的链接列表创建一个通用堆栈

时间:2012-01-25 09:26:55

标签: c data-structures stack linked-list function-pointers

我想创建一个通用堆栈。我想用链表实现它。

我创建了这个结构 stack_l

typedef struct stack
 {
   void * data;

   void (*copy)(void *o);

   struct stack *next;

 } stack_l;

我有一些问题:


  • 结构的第二个字段是指向函数的指针,用于复制新数据(在函数Push中通过参数传递)。 函数Push的原型是:
  

stack_l * Push(stack_l * head,void * d);

  1. 我将指针传递给函数副本是否正确?
  2. 我必须在函数Push ??
  3. 中实现它
    • 是否需要创建一个函数NewStack(例如)来初始化结构的字段,或者最好只有一个Push函数,如果堆栈为空则创建第一个元素,如果有的话,在顶部添加新元素至少有一个元素?

    • 需要使用malloc分配 void * 吗?

1 个答案:

答案 0 :(得分:1)

首先,stackstack_l不需要不同的标识符。现在,问你的问题:

您的Push功能与copystack_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*的一部分。