2011-06-28 204 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;