我最近在读一本书,这是在链接列表中实现堆栈的解释。以下是解释:
typedef struct Element {
struct Element *next;
void *data;
} Element;
push 和 pop 对应的原型如下:
void push( Element *stack, void *data );
void *pop( Element *stack );
现在考虑在适当的功能和错误处理方面在这些例程中发生了什么。这两个操作都会更改列表的第一个元素。必须修改调用例程的堆栈指针以反映此更改,但您对传递给这些函数的指针所做的任何更改都不会传播回调用例程。您可以通过让两个例程都获取指向堆栈指针的指针来解决此问题。这样,您可以更改调用例程的指针,使其继续指向列表的第一个元素。实施此更改会导致以下结果:
void push( Element **stack, void *data );
void *pop( Element **stack );
但是,我想知道的是,需要为堆栈放置双指针吗?我理解双指针的概念,但是,当使用创建新节点时
Element *node1 = (Element *) malloc (sizeof(Element));
,我们已经有了指向该节点的指针。为什么不直接发送这个指针而不是使用双指针呢?