2011-06-28 209 views
0

我正在尝试使用链接列表来简单动态实现堆栈。 接下来是我的代码。该代码没有错误。但是在函数内部完成的更改没有反映出来,尽管我相信我通过引用传递了结构。 尽管我已经能够通过使用全局结构来完成这项工作,但是我在这里错过了一个非常基本的概念,所以想知道我在理解什么是错误的,以及如何反映在没有主函数的情况下在弹出函数中完成的更改使用全球范围。通过引用传递结构c

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); 
} 

回答

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; 
} 

顺便说一下,INT的C FAQ提及。

正如Richard Pennington提到的那样,您需要声明s1像这样:struct stack *s1;

+1

并将s1声明为main()中的指针。 –

+0

@Richard Pennington对:-) – cnicutar

0

您正在将指针传递给堆栈并尝试更改它。

0

正如cnicutar所说,s1 = s2没有做任何有用的事情。你可能想要* s1 = * s2;