一个很奇怪的问题,大家看看(看谁能解决?)

来源:百度知道 编辑:UC知道 时间:2024/05/20 05:04:19
#include "ourhdr.h"

typedef struct node
{
int data;
struct node * next;
}pNode,*LinkStack;

/* Push the element into the chainStack */
int L_Push(LinkStack L,int e)
{
LinkStack p;
if((p=(LinkStack)malloc(sizeof(pNode)))==NULL)
{
printf("\nCan't assign memery\n");
exit(-1);
}
/*
p->data=4;
p->next=L;
L=p;
*/
L->data=4;
return(0);
}

int main(void)
{
LinkStack S;
int * elem;

if((S=(LinkStack)malloc(sizeof(pNode)))==NULL)
{
printf("\nCan't assign memery\n");
exit(-1);
}
if((elem=(int *)malloc(sizeof(int)))==NULL)
{
printf("\nCan't assign memery\n");
exit(-1);
}
S->data=3;
S->next=NULL;
/*第一个注释:这里没有调用函数*/
/* LinkStack p;
if((p=(LinkStack)

这个程序能编译吗??那个版本的编译器啊??

你的参数有问题,你的参数L虽然是一个指针,当它在函数内部指向了一个新的节点,但是你在主程序中的S仍然没有改变,也就是说当你执行了那个函数后S指向的是L->next 那个节点,所以不是预期的代码,所以你的参数应该用指针的指针,修改函数代码如下:
int L_Push(LinkStack *L,int e)
{
LinkStack p;
if((p=(LinkStack)malloc(sizeof(pNode)))==NULL)
{
printf("\nCan't assign memery\n");
exit(-1);
}
p->data=4;
p->next=*L;
*L=p;
return(0);
}
调用改为:
if((L_Push(&S,1))!=0)
这样就不会出现你说的问题了。

如LS所说的,要用二级指针,或者一级指针引用传递。

你输入的参数如果是指针,就不要妄图想在函数里改变指针的地址,这个道理跟我们传入2个变量无法交换它们一样chang(int a,int b);而必须用change(int *a,int *b);来改变他们的值。
你在L_Push函数中L=p; 这样的做法显然是无法得到效果的。如果想达到这样的效果,你应该用指针的指针作为参数传入。

/*
p->data=4;
p->next=L;
L=p;
*/
L->data=4; 则能改变链头的值,输出结果为4
你把L=p;注释掉了,当然是正确的。