以下代码是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
,并将它的数据指针指向给定的内存。