读书人

链栈有关问题有源码

发布时间: 2012-09-03 09:48:39 作者: rapoo

链栈问题——有源码
源码:

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

读书人网 >C语言

热点推荐