我正在尝试使用链接列表进行简单的堆栈动态实现。 接下来是我的代码。代码没有错误。但是,虽然我相信我通过引用传递结构,但函数内部所做的更改并未反映出来。 虽然我已经能够通过使用全局结构来完成这项工作,但我在这里缺少一个非常基本的概念,所以想知道我在理解错误是什么,如何在不使用的情况下反映在pop函数中所做的更改全球范围。
struct stack
{
char value;
struct stack *next;
};
void push(char a,struct stack *s1)
{
struct stack *s2;
s2=(struct stack *)malloc(sizeof(struct stack));
if(empty(s1))
{
s2->value=a;
s2->next=NULL;
s1=s2;
}
else
{
s2->value=a;
s2->next=s1;
s1=s2;
}
return;
}
int main()
{
struct stack s1;
push(c,&s1);
printf("%d",s1.value);
}
答案 0 :(得分:3)
s1=s2;
这可能不会做你想要的。您正在修改堆栈的本地副本。
尝试
void push(char a,struct stack **s1)
{
struct stack *s2;
s2=(struct stack *)malloc(sizeof(struct stack));
if(empty(*s1))
{
s2->value=a;
s2->next=NULL;
*s1=s2;
}
else
{
s2->value=a;
s2->next=s1;
*s1=s2;
}
return;
}
顺便提一下,它在C FAQ中提到。
正如理查德·彭宁顿所提到的,你需要像s1
那样声明struct stack *s1;
。
答案 1 :(得分:0)
您正在将指针传递给堆栈值并尝试更改它。
答案 2 :(得分:0)
正如cnicutar所说,s1 = s2没有做任何有用的事情。你可能想要* s1 = * s2;