栈在C中通过链表实现



以下代码是c中通过链表实现的堆栈实现的一部分。代码有问题吗?具体来说,在pop()方法中,调用者传递一个void**参数,这样pop()就可以给它分配一个指向顶级节点数据的指针。pop()随后调用delete来释放堆栈的顶部节点,这是*data指向的地方。这不会删除指针中的数据,应该返回给调用者,还是我错过了什么?

typedef struct Element 
{
    struct Element *next;
    void *data;
} Element;

bool pop( Element **stack, void **data )
{
    Element *elem;
    if (!(elem = *stack)) return false;
    *data = elem->data;
    *stack = elem->next;
    delete elem;
    return true;
}

bool push( Element **stack, void *data )
{
    Element *elem = new Element;
    if(!elem) return false;
    elem->data = data;
    elem->next = *stack;
    *stack = elem;
    return true;
} 

几点思考:

  • 如果你想用C编译器编译它,使用malloc()和free()代替new和delete。
  • 如果你需要一个快速的方法来确定堆栈的大小,我建议做一个堆栈数据结构,保存头和尾指针和堆栈的长度,然后传递到你的push()和pop()函数。最重要的是,你不需要双指针。
  • 从pop()函数返回数据指针,不要忘记free()它(如果必要的话)。

pop的实现是可以的。Element结构体和数据指针是两个独立的内存块。删除list元素不会删除其成员所指向的数据。你可以在push函数中看得更清楚。它创建一个新的Element,并将它的数据指针指向给定的内存。

相关内容

  • 没有找到相关文章

最新更新