我正在编写一些 C 代码来实现基本的 Stack 数据结构操作,如 push、pop 等。我正在使用堆栈的链表实现。在这个实现中,每次我将一个值推入卡住时,我都会创建一个新节点,并将其设置为我的链表的头节点。所以这涉及到改变头节点的引用。
void push(stack **t, int ele)
{
stack *new, *temp;
temp=*t;
new=(stack *)malloc(sizeof(stack));
if(new==NULL)
{
printf("\n stack overflow");
return;
}
new=(stack *)malloc(sizeof(stack));
new->val=ele;
new->next=*t;
*t=new;
}
如果我要使用单指针编写类似的代码,那么它将是这样的
void push(stack *t, int ele)
{
stack *new, *temp;
temp=t;
new=(stack *)malloc(sizeof(stack));
if(new==NULL)
{
printf("\n stack overflow");
return;
}
new=(stack *)malloc(sizeof(stack));
new->val=ele;
new->next=t;
t=new;
}
在函数中,头节点(**t)出现在所有步骤的赋值的 RHS 上,但这个
*t=new;
基本上,第一个代码将'new'分配给**t的指针,即*t,而第二个代码将'new'分配给*t的指针,即t。两者似乎都只需要将指向头节点的单个指针分配为“新”,但只有第一个代码有效,第二个代码实际上并没有修改头节点值。
发生这种情况的解释是什么?为什么第二个代码的工作方式与第一个代码不同?