通过C中的链表实现堆栈

时间:2011-04-25 14:21:11

标签: c++ data-structures linked-list

以下代码是堆栈实现的一部分,通过链接列表在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;
} 

2 个答案:

答案 0 :(得分:3)

一些想法:

  • 如果要使用C编译器编译它,请使用malloc()和free()而不是new和delete。这些是C ++关键字。
  • 如果你需要一个快速的方法来确定堆栈的大小,我建议创建一个包含头尾指针和堆栈长度的堆栈数据结构,然后将其传递给push()和pop()函数。最重要的是,你不需要双指针。
  • 从pop()函数返回数据指针,不要忘记free()它(如有必要)。

答案 1 :(得分:1)

pop实施是可以的。 Element结构和数据指针是两个独立的内存块。删除列表元素不会删除其成员指向的数据。您可以在push函数中更清楚地看到这一点。它创建一个新的Element并将其数据指针设置为给定的内存。