以下代码是堆栈实现的一部分,通过链接列表在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;
}
答案 0 :(得分:3)
一些想法:
答案 1 :(得分:1)
pop
实施是可以的。 Element
结构和数据指针是两个独立的内存块。删除列表元素不会删除其成员指向的数据。您可以在push
函数中更清楚地看到这一点。它创建一个新的Element
并将其数据指针设置为给定的内存。