user-0 提问: 关于链栈的问题。为什么输入数据后，输出错误啊？求教。

回复:
user: user-1
content: 好长，没耐性看呐

user: user-2
content: 引用 9 楼 u013429409 的回复:哦，终于知道了。我刚才那个懂了，Pop没改过来。pop函数出栈了，我还是指向那个。谢谢你啊。 不客气不客气。请点击上方“结贴”按钮，谢谢

user: user-0
content: 哦，终于知道了。我刚才那个懂了，Pop没改过来。pop函数出栈了，我还是指向那个。谢谢你啊。

user: user-2
content: 引用 7 楼 u013429409 的回复:是啊。我把输出函数放到前面是可以。但我想最后输出栈中的元素。为什么输出放在最后不可以啊？ 之前让你改的内容，你还是没明白啊。 Push函数，为什么让你把返回值改成StackNode *，然后把top返回？ 是因为你把top作为参数穿进去，传递的是一个指针。函数中可以变更指针指向的地址的内容，但是不能更改指针的值啊。 因为实参是指针变量的一个拷贝，所以指针变量自身的值是不能变更的。所以必须通过将top返回，才能改变指针的值。  基于这个愿意，增加Pop操作之后，Pop函数也要增加同Push一样的变更。也就是把返回值改成StackNode *，然后把top返回

user: user-0
content: 是啊。我把输出函数放到前面是可以。但我想最后输出栈中的元素。为什么输出放在最后不可以啊？

user: user-2
content: 上面的格式乱了，重新贴一个。改动的地方就是1、2楼说的，你自己diff一下  #include<stdio.h> #include<malloc.h> #define N 6 typedef int elemtype; typedef struct stacknode{    elemtype data;    struct stacknode *next; }StackNode; StackNode *InitStack(StackNode *top){     top=(StackNode *)malloc(sizeof(StackNode));     top->next=NULL;     return top; } int Judge(StackNode *top){     if(top->next==NULL)        {            printf("建栈成功...\n");            return 1;        }     else        {             printf("建栈失败!\n");             return 0;        } } StackNode *Push(StackNode *top){     StackNode *p;     int i,item;     for(i=0;i<N;i++)         {             printf("请输入第%d个值item\n",i+1);             scanf("%d",&item);             p=(StackNode *)malloc(sizeof(StackNode));             p->next=NULL;             p->data=item;             p->next=top;             top=p;         }     return top; } int Output(StackNode *top){     int i;     for(i=0;i<N;i++)         {             printf("%d ",top->data);             top=top->next;         }     return 1; } int main() {     StackNode *top;     top=InitStack(top);     Judge(top);     top = Push(top);     printf("链式栈的输出（从栈顶到栈底）\n");     Output(top);     return 0; }

user: user-2
content: 引用 3 楼 u013429409 的回复:恩恩  是的。我改了一下是可以了。但我还是不知道为什么输出还是出错，能再帮我看看吗。谢谢！ #include<stdio.h> #include<malloc.h> #define N 6 typedef int elemtype; typedef struct stacknode{    elemtype data;    struct stacknode *next; }StackNode; //链式栈的初始化 StackNode *InitStack(StackNode *top){     top=(StackNode *)malloc(sizeof(StackNode));     top=NULL;     return top; } //判断是否建栈成功 int Judge(StackNode *top){     if(top==NULL)        {            printf("建栈成功...\n");            return 1;        }     else        {             printf("建栈失败!\n");             return 0;        } } //链式栈入栈操作 StackNode *Push(StackNode *top){     StackNode *p;     int i,item;     for(i=0;i<N;i++)         {             printf("请输入第%d个值item:",i+1);             scanf("%d",&item);             p=(StackNode *)malloc(sizeof(StackNode));             p->next=NULL;             p->data=item;             p->next=top;             top=p;         }     return top; } //取栈顶元素的值 int StackTop(StackNode *top){     int item;     if(top==NULL)     {         printf("栈空.\n");         return 0;     }     else       {           item=top->data;           printf("栈顶的元素为%d\n",item);       }     return 1; } //链式栈的出栈操作 int Pop(StackNode *top){     int item;     StackNode *p;     p=top;     if(top==NULL)         {             printf("栈空.\n");             return 0;         }     else     {         item=p->data;         top=p->next;         free(p);         printf("出栈的元素为%d\n",item);         return 1;     } } //链式栈的输出（从栈顶到栈底） int Output(StackNode *top){     int i;     for(i=0;i<N-1;i++)         {             printf("%d ",top->data);             top=top->next;         }     printf("\n");     return 1; } int main() {     StackNode *top;     top=InitStack(top);     Judge(top);     printf("链式栈入栈操作\n");     top=Push(top);     printf("取栈顶元素的值\n");     StackTop(top);     printf("链式栈的出栈操作\n");     Pop(top);     printf("链式栈的输出（从栈顶到栈底）\n");     Output(top);     return 0; } 你开始的代码，稍微改下就行了  #include<stdio.h> #include<malloc.h> #define N 6 typedef int elemtype; typedef struct stacknode{    elemtype data;    struct stacknode *next; }StackNode; StackNode *InitStack(StackNode *top){     top=(StackNode *)malloc(sizeof(StackNode));     top->next=NULL;     return top; } int Judge(StackNode *top){     if(top->next==NULL)        {            printf("建栈成功...\n");            return 1;        }     else        {             printf("建栈失败!\n");             return 0;        } } StackNode *Push(StackNode *top){     StackNode *p;     int i,item;     for(i=0;i<N;i++)         {             printf("请输入第%d个值item\n",i+1);             scanf("%d",&item);             p=(StackNode *)malloc(sizeof(StackNode));             p->next=NULL;             p->data=item;             p->next=top;             top=p;         }     return top; } int Output(StackNode *top){     int i;     for(i=0;i<N;i++)         {             printf("%d ",top->data);             top=top->next;         }     return 1; } int main() {     StackNode *top;     top=InitStack(top);     Judge(top);     top = Push(top);     printf("链式栈的输出（从栈顶到栈底）\n");     Output(top);     return 0; }

user: user-0
content: 恩恩  是的。我改了一下是可以了。但我还是不知道为什么输出还是出错，能再帮我看看吗。谢谢！ #include<stdio.h> #include<malloc.h> #define N 6 typedef int elemtype; typedef struct stacknode{    elemtype data;    struct stacknode *next; }StackNode; //链式栈的初始化 StackNode *InitStack(StackNode *top){     top=(StackNode *)malloc(sizeof(StackNode));     top=NULL;     return top; } //判断是否建栈成功 int Judge(StackNode *top){     if(top==NULL)        {            printf("建栈成功...\n");            return 1;        }     else        {             printf("建栈失败!\n");             return 0;        } } //链式栈入栈操作 StackNode *Push(StackNode *top){     StackNode *p;     int i,item;     for(i=0;i<N;i++)         {             printf("请输入第%d个值item:",i+1);             scanf("%d",&item);             p=(StackNode *)malloc(sizeof(StackNode));             p->next=NULL;             p->data=item;             p->next=top;             top=p;         }     return top; } //取栈顶元素的值 int StackTop(StackNode *top){     int item;     if(top==NULL)     {         printf("栈空.\n");         return 0;     }     else       {           item=top->data;           printf("栈顶的元素为%d\n",item);       }     return 1; } //链式栈的出栈操作 int Pop(StackNode *top){     int item;     StackNode *p;     p=top;     if(top==NULL)         {             printf("栈空.\n");             return 0;         }     else     {         item=p->data;         top=p->next;         free(p);         printf("出栈的元素为%d\n",item);         return 1;     } } //链式栈的输出（从栈顶到栈底） int Output(StackNode *top){     int i;     for(i=0;i<N-1;i++)         {             printf("%d ",top->data);             top=top->next;         }     printf("\n");     return 1; } int main() {     StackNode *top;     top=InitStack(top);     Judge(top);     printf("链式栈入栈操作\n");     top=Push(top);     printf("取栈顶元素的值\n");     StackTop(top);     printf("链式栈的出栈操作\n");     Pop(top);     printf("链式栈的输出（从栈顶到栈底）\n");     Output(top);     return 0; }

user: user-2
content: 同时Push这个函数的返回值类型改成StackNode *，然后在函数中返回top

user: user-2
content: scanf("%d",item);->scanf("%d",&item);