链栈问题——有源码
源码:
- C/C++ code
#include<stdio.h>#include<malloc.h>typedef struct node{int data;struct node *next;}StackNode,*LinkStack;/*置空栈*/LinkStack Init_LinkStack(){return NULL;}/*判空栈*/int Empty_ListStack(LinkStack top){if(top==NULL) return 1;else return 0;}/*入栈*/LinkStack Push_LinkStack(LinkStack top,int data){StackNode *s;s=malloc(sizeof(StackNode));s->data=data;s->next=top;top=s;return top;}void main(){LinkStack L;L=malloc(sizeof(LinkStack));L->next=NULL;Push_LinkStack(L,20);printf("%d\n",L->data);}
主要是在主函数中调用Push_LinkStack函数的时候,就跟没有执行一样,L->data的值也不为20.但是如果我改成L=Push_LinkStack(L,20);的话L->data就为20了。这是为什么。怎么都想不通,在Push_LinkStack函数里,我明明是return top了的。大家看,怎么回事?
[解决办法]
L是通过返回值返回的, 并不能通过参数返回, 因为参数传进来的是一个指针地址的拷贝,不论在函数里面这个指针所指向的位置怎么变化, 函数外都是不变的, 所以当函数里面的top指向一个新分配的元素时,外面的top还是之前top
[解决办法]
LinkStack L说明L是一个指针,而你的Push_LinkStack()函数中又创建了一个指针s用s->data存储输入的data值,然后将top指向s,return top又没什么用,函数外没有东西接收,这个和void没区别;
printf("%d\n",L->data);
而你的printf中L->data是没有赋值的
在源码上将此句改为LinkStack Push_LinkStack(LinkStack &top,int data)就可以了
[解决办法]
- C/C++ code
#include<stdio.h>#include<malloc.h>typedef struct node{ int data; struct node *next;}StackNode,*LinkStack;/*置空栈*/LinkStack Init_LinkStack(){ return NULL;}/*判空栈*/int Empty_ListStack(LinkStack top){ if(top==NULL) return 1; else return 0;}/*入栈*/LinkStack Push_LinkStack(LinkStack top,int data){ StackNode *s; s=(StackNode*)malloc(sizeof(StackNode)); s->data=data; s->next=top;top=s; return top;}void main(){ LinkStack L,top; L=(LinkStack)malloc(sizeof(LinkStack)); L->next=NULL; top=Push_LinkStack(L,20); printf("%d\n",top->data);}